|
1、BX,SI,DI,BP
在8086中,只有这4个寄存器是可以用在“[...]”中进行内存单元寻址的。 像:mov ax, [cx] mov ax, [ax] mov ax, [dx] mov ax, [ds] 这些都是错误的写法。
在[...]中,这4个寄存器可以单个出现,或只能以四种组合出现:bx和si、 bx和di、bp和si、bp和di。 如 mov ax, [bx + bp] mov ax, [si + di] 都为错误的写法。
只要在[...]中使用寄存器bp,而指令中没有显性地给出段地址,段地址就默认在ss中。
2、在没有寄存器名存在的情况下,用操作符 X ptr 指明内存单元的长度,X 在汇编指令中可以为 word 或 byte。
如:
mov word ptr ds:[0], 1
mov byte ptr ds:[0], 1
3、相对基址变址寻址
[bx + si + idata] [bx + di + idata] [bp + si + idata] [bp + di + idata]
在应用中和C语言的对比
strcut company {
char cn[3];
char hn[9];
int pm;
int sr;
char cp[3];
};
struct comany dec = { "DEC", "Ken Olsen", 137, 40, "PDP" };
修改 dec.cp[3] 中的 PDP 字符
i = 0;
dec.cp = 'V';
i++;
dec.cp = 'A';
i++;
dec.cp = 'X';
和汇编对比,汇编修改:
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'
用 [bx + idata + si] 的方式来访问结构体中的数据。 bx 定位整个结构体; idata 定义结构体中的某一个数据项,用 si 定位数组项中的每个元素。汇编提供的更为贴切的书写方式如:[bx].idata[si]。
比较C语言中的:dec.cp
dec 是个变量名,指名了结构体的变量地址,cp指名数据项cp的地址,而 i 用来定位 cp 中的每一个字符。这和汇编是很相似的。
|
|