寻址方式的综合应用

问题

1.png
2.png
3.png

分析

要修改的数据:

1、DEC公司的排名字段

2、DEC公司的收入字段

3、DEC公司的产品字段,这个是字符的

分析内存单元,可以看出来每个数据占用了多大的空间

方法

1、首先确定DEC公司记录的位置,R=seg:60

2、确定访问的内容在记录中的位置

3、确定排名字段在记录中的位置,也就是0CH

4、修改R + 0CH的数据

5、修改R + 0EH的数据

6、10H处的数据是字符,所以要进一步确定每一个字符在字符串中的位置,一个字符一个字节

​ 所以修改R + 10H + 0,R + 10H + 1,R + 10H + 2 处的数据

代码

mov ax,seg
mov ds,ax
mov bx,60h                  ;确定记录的地址:ds:bx
mov word ptr [bx+0ch],38  ;排名字段改成38
add word ptr [bx+0eh],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语言来写出来:

struct company
{
 char cn[3];  //定义公司的名称
 char hn[9];  //定义总裁姓名
 int pm;      //排名
 int sr;      //收入
 char cp[3];  //著名产品
};
​
struct company dec = {"DEC","Ken Olsen",137,40,"PDF"};
​
int 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';
}

对比一下二者的代码:

mov ax,seg
mov ds,ax
mov bx,60h 
mov word ptr [bx+0ch],38  ;C: dec.pm = 38;
add word ptr [bx+0eh],70  ;C: dec.sr = dec.sr + 70;
​
mov si,0                  ;C: i = 0;
mov byte ptr [bx+10h+si],'V'  ;C: dec.cp[i] = 'V';
inc si                      ;C: i++;
mov byte ptr [bx+10h+si],'A'  ;C: dec.cp[i] = 'A';
inc si                      ;C: i++;
mov byte ptr [bx+10h+si],'X'  ;C: dec.cp[i] = 'X';x

总结

1、可以看出来,8086CPU提供的如[bx+si+idata]的寻址方式为结构化数据的处理提供了方便,使得我们可以在编程的时候从结构化的角度去看待所要处理的数据

2、一般来说,我们可以用[bx+si+idata]的方式来访问结构体中的数据,用bx来定位整个结构体,用idata定位结构体中的某一个数据项,用si定位数组项中的每个元素,可以这样子写:

[bx].idata、[bx].idata[si]

你可能感兴趣的:(寻址方式的综合应用)