比如说有这么一条记录
这些数据在内存中存放的位置如下所示
如果这个时候这个公司的情况发生了改变,情况如下所示
这个时候我们需要去对这些数据利用汇编指令进行修改,我们可以这么做
mov ax,seg
mov ds,ax
mov bx,60h ;确定了记录的地址 ds:bx
mov word ptr [bx+0ch],38
add word ptr [bx+0eh],70
mov si,0
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 pn[9]; //总裁姓名
int pm; //排名
int sl; //收入
char cp[3]; //著名产品
};
//定义一条公司的记录,也就是说内存当中是有了一条公司的记录
struct company dec = {"DEC","Ken Olsen",137,40,"PDP"};
main()
{
int i;
dec.pm=38;
dec.sl=dec.sl+70;
i=0;
dec.cp[i]='V';
i++;
dec.cp[i]='A';
i++;
dec.cp[i]='X';
return 0;
}
如果再按照C语言的方式,用8086汇编去编写一下程序,我们会发现8086CPU提供的[bx+si+idata]的寻址方式为结构化数据的处理提供了很好的方式,比如说我们可以用[bx+idata+si]的方式去访问结构体当中的数据,可以用bx去定位一整个结构体,用idata去定位结构体当中的某一个数据项,用si去定位数组项当中的每一个元素
mov ax,seg
mov ds,ax
mov bx,60h ;把首地址放到bx
mov word ptr [bx].0ch,38 ;将排名的字段改为38即dec.pm=38;
add word ptr [bx].0eh,70 ;收入的字段加70即dec.sl = dec.sl+70;
mov si,0 ;相当于 i=0;
mov byte ptr [bx].10h[si],'V' ;修改字符串的值dec.cp[i]='V';
inc si ;i++
mov byte ptr [bx].10h[si],'A' ;dec.cp[i]='A';
inc si ; i++;
mov byte ptr [bx].10h[si],'X' ; dec.cp[i]='X'
其实在C语言程序当中,dec.cp[i],dec是一个变量名,其实就是指的是结构体变量的地址,cp也是一个名词,指的其实就是数据项cp的地址,而i则是用来定位cp当中的每一个字符,所以汇编当中就使用bx.10h[si]