ds:[bx+i]、ds:[bx+i+si/di]与内存中数据的结构化访问
在汇编编程中,最简单的内存数据访问方式为:ds:[i/bx],其中i为立即数,该方式直接访问ds指向的数据段中第i个字节/字(具体取决于要访问的数据宽度——如mov byte/word ptr ds:[0], ax)。这种方式适用于很容易地知道所要访问的数据在段中的具体地址的情形,如数组。但如果要处理结构稍微复杂一些的数据,则这种方式就难以应对了。因此8086处理器还提供了ds:[bx+i]和ds:[bx+i+si/di]两种内存数据访问方式。
ds:[bx+i]适用的情况如:结构体或结构体数组(不限于此)。当访问结构体st中的元素c时,可用bx存放结构体st的起始地址,i存放c在结构体中的偏移地址,如st.c = 1汇编后变成:mov ds:[bx+2], 1。注意:在编译时,结构体中各元素的偏移地址编译器都是知道的,因此可以直接确定立即数i,而bx是动态的,因此可以用于存放结构体数组中某一结构体的地址。ds:[bx+i]也常写成ds:i[bx]或ds:[bx].i,不同的形式可以根据对不同情况的理解来选择。
struct myst { char a; char b; int c; } st;
ds:[bx+i+si]适用的情况如:元素为数组的结构体(不限于此)。当访问结构体st中的元素c[k]时,可用bx存放结构体st的起始地址,i存放c在结构体中的偏移地址,而si存放数组元素的索引号,如st.c[k] = 1汇编后变成:mov ds:[bx+2+si], 1 其中si=k。ds:[bx+i+si]也可以写成ds:[i+bx+si]、ds:i[bx][si]、ds:[bx].200[si]或ds:[bx][si].200
struct myst { char a; char b; int c[10]; } st;
以上这些有助于对内存中数据访问方式的理解,包括要访问的数据宽度的设置和数据在内存中的寻址等。