问题
分析
要修改的数据:
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]