找回密码
 register

QQ登录

只需一步,快速开始

查看: 11|回复: 0

[汇编语言] [零基础入门学习]·40·数据处理的两个基本问题·寻址方式的综合应用

[复制链接]

[汇编语言] [零基础入门学习]·40·数据处理的两个基本问题·寻址方式的综合应用

[复制链接]
  • 打卡等级:热心大叔
  • 打卡总天数:94
  • 打卡月天数:17
  • 打卡总奖励:94
  • 最近打卡:2025-01-18 01:28:20
Waylee

主题

0

回帖

1万

积分

仙帝

积分
11929
Waylee 2025-1-16 18:24 | 显示全部楼层 |阅读模式 | Google Chrome | Windows 10

马上注册,查看网站隐藏内容!!

您需要 登录 才可以下载或查看,没有账号?register

×


8.6 寻址方式的综合应用

下面我们通过一个问题来进一步讨论一下各种寻址方式的作用。
关于DEC公司的一条记录(1982年)如下。

公司名称:DEC
总裁姓名:Ken Olsen
排名:137
收入:40(40亿美元)
著名产品:PDP(小型机)

这些数据在内存中以图8.1所示的方式存放。

可以看到,这些数据被存放在seg段中从偏移地址60H起始的位置,从seg:60起始以ASCII字符的形式存储了3个字节的公司名称;从seg:60+3起始以ASCII字符的形式存储了9个字节的总裁姓名;从seg:60+0C起始存放了一个字型数据,总裁在富翁榜上的排名;从seg:60+0E起始存放了一个字型数据,公司的收入;从seg:60+10起始以ASCII字符的形式存储了3个字节的产品名称。

QQ截图20250116174304.webp

以上是该公司1982年的情况,到了1988年DEC公司的信息有了如下变化。

  1. Ken Olsen 在富翁榜上的排名已升至38位;
  2. DEC的收入增加了70亿美元;
  3. 该公司的著名产品已变为VAX系列计算机。

我们提出的任务是,编程修改内存中的过时数据。
首先,我们应该分析一下要修改的数据。
要修改的内容是:

  1. (DEC公司记录)的(排名字段)
  2. (DEC公司记录)的(收入字段)
  3. (DEC公司记录)的(产品字段)的(第一个字符)、(第二个字符)、(第三个字符)

从要修改的内容,我们就可以逐步地确定修改的方法。

  1. 要修改的数据是DEC公司的记录,所以,首先要确定DEC公司记录的位置:
    R=seg:60
    确定了公司记录的位置后,下面就进一步确定要访问的内容在记录中的位置。
  2. 确定排名字段在记录中的位置:0CH。
  3. 修改R+0CH处的数据。
  4. 确定收入字段在记录中的位置:0EH。
  5. 修改R+0EH处的数据。
  6. 确定产品字段在记录中的位置:10H。
    要修改的产品字段是一个字符串(或一个数组),需要访问字符串中的每一个字符。所以要进一步确定每一个字符在字符串中的位置。
  7. 确定第一个字符在产品字段中的位置:P=0。
  8. 修改R+10H+P处的数据:P=P+1。
  9. 修改R+10H+P处的数据:P=P+1。
  10. 修改R+10H+P处的数据。

根据上面的分析,程序如下。

mov ax,seg
mov ds,ax
mov bx,60h          ;确定记录地址,ds:bx

mov word ptr [bx+0ch],38    ;排名字段改为38
add word ptr [bx+oeh],70    ;收入字段增加70

mov si,0                ;用si来定位产品字符串中的字符
mov byte ptr [bx+10h+si],'V'
inc si
mov byte ptr [bx+10h+si],'A'
inc si
mov byte ptr [bx+10h+si],'X'

如果你熟悉C语言的话,我们可以用C语言来描述这个程序,大概应该是这样的:

struct company{     /*定义一个公司记录的结构体*/
    char cn[3]; /*公司名称*/
    char hn[9]; /*总裁姓名*/
    int pm;     /*排名*/
    int sr;     /*收入*/
    char cp[3]; /*著名产品*/
};
struct company dec={"DEC","Ken Olsen",137,40,"PDP"};
/*定义一个公司记录的变量,内存中将存有一个公司的记录*/

main()
{
    int i;
    dec.pm = 38;
    dec,sr=dec.sr+70;
    i=0;
    dec.cp[i]='V';
    i++;
    dec.cp[i]='A';
    i++;
    dec.cp[i]='X';
    return 0;
}

我们再按照C语言的风格,用汇编语言写一下这个程序,注意和C语言相关语句的比对:

mov ax,seg
mov ds,ax
mov bx,60h          ;记录首址送BX
mov word ptr [bx].0ch,38    ;排名字段改为38
                    ;C:dec.pm=38;
add word ptr [bx].oeh,70    ;收入字段增加70
                    ;C:dec.sr=dec.sr+70;
                    ;产品字段改为字符串'VAX'
mov si,0                ;C:i=0;
mov byte ptr [bx].10h[si],'V';  dec.co[i]='V';
inc si                  ;   i++;
mov byte ptr [bx].10h[si],'A';  dec.co[i]='A';
inc si                  ;   i++;
mov byte ptr [bx].10h[si],'X';  dec.co[i]='X';

我们快看到,8086CPU提供的如[bx+si+idata]的寻址方式为结构化的处理提供了方便。使得我们可以在编程的时候,从结构化的角度去看待所要处理的数据。从上面可以看到,一个结构化的数据包含了多个数据项,而数据项的类型又不相同,又的是字型数据,有的是字节型数据,有的是数组(字符串)。一般来说,我们可以用[bx+idata+si]的方式来访问结构中的数据。用bx定位整个结构体,用idata定位结构体中某一个数据项,用si定位数组项中的每一个元素。为此,汇编语言提供了更为贴切的书写方式,如:[bx]+idata、[bx].idata[si]。
在C语言程序中我们看到,如:dec.cp[i],dec是一个变量名,指明了结构体变量的地址,cp是一个名称,指明了数据项cp的地址,而i用来定位cp中的每一个字符。汇编语言中的做法是:bx.10h[si]。看一下,是不是很相似?

您需要登录后才可以回帖 登录 | register

本版积分规则

雪舞知识库 | 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 |天天打卡

GMT+8, 2025-1-18 10:08 , Processed in 0.115183 second(s), 8 queries , Redis On.

Powered by XueWu Licensed

Copyright © Tencent Cloud.

快速回复 返回顶部 返回列表