一、bx、si、di 和 bp
在使用过程中有几处需要注意的地方:
(1)在 8086CPU 中,只有这4个寄存器可以用在“[....]”中来进行内存单元的寻址。其他寄存器是不可以的,例如“mov bx, [ax]”就是错误的用法。
(2)在[...]中,这四个寄存器可以单个出现,或只能以4种组合出现:bx和si、bx和di、bp和si、bp和di。为了方便记忆可以将si和di看做一组,将bx和bp看做一组。组间可以自由组合,组内不能组合。
以下指令都是正确的:
mov ax,[bx] mov ax,[si] mov ax,[di] mov ax,[bp] mov ax,[bx+si] mov ax,[bx+di] mov ax,[bp+si] mov ax,[bp+di] mov ax,[bx+si+idata] mov ax,[bx+di+idata] mov ax,[bp+si+idata] mov ax,[bp+di+idata]
(3)只要在[...]中使用寄存器bp,而指令中没有显性的给出段地址,则段地址就默认在ss中。
mov ax,[bp] ;含义:(ax)=((ss)*16+(bp)) mov ax,[bp+idata] ;含义:(ax)=((ss)*16+ (bp)+idata) mov ax,[bp+si] ;含义:(ax)=((ss)*16+(bp)+(si)) mov ax,[bp+si+idata] ;含义:(ax)=((ss)*16+(bp)+(si)+idata)
二、汇编语言中数据位置的表达
(1)立即数
对于直接包含在机器指令中的数据(执行前在CPU的指令缓冲器中),汇编语言中称为立即数(idata),在汇编指令中直接给出。 例如:
mov ax, 1 or bx, 00100000B
(2)寄存器
指令要处理的数据在寄存器中,在汇编指令中给出相应的寄存器名。例如:
mov ax, bx push bx
(3)段地址(SA)和偏移地址(EA)
指令要处理的数据在内存中,在汇编语言中可以用[X]的格式给出EA,SA在某个段寄存器中。
存放段地址的寄存器可以是默认的,也可以显性给出。例如:
;段寄存器默认存储在DS中 mov ax, [0] mov ax, [bx] mov ax, [di] ... ;段寄存器默认存储在SS中 mov ax, [bp] mov ax, [bp+si] mov ax, [bp+di] ... ;段寄存器显性给出 mov ax, ds:[bp] mov ax, es:[3] mov ax, ss:[bx+si] mov ax, cs:[bx+si+8]
三、寻址方式
四、指令要处理的数据有多长
8086CPU的指令,可以处理两种尺寸的数据,byte和word。所以在机器指令中要指明,指令进行的是字操作还是字节操作。对于这个问题,汇编语言中用以下方法处理。
(1)通过寄存器名指定要处理的数据的尺寸。如果寄存器名是字型寄存器(如ax、bx等),则说明指令进行的是字操作。如果寄存器名是字节型寄存器(如al、ah、bl等),则说明指令进行的是字节操作。
(2)在没有寄存器名存在的情况下,用操作符X ptr指明内存单元的长度,X在汇编指令中可以为word或byte。这种情形适用于没有寄存器参与的内存单元访问指令中。例如:
;下面的指令,用word ptr指明了指令中访问的内存单元是一个字单元 mov word ptr ds:[0], 1 inc word ptr [bx] ;下面的指令,用byte ptr指明了指令访问的内存单元是一个字节单元 mov byte ptr ds:[0], 1 inc byte ptr [bx]
五、div 指令
div是除法指令。在使用的过程中应注意以下问题:
(1)除数:有8位和16位两种,在一个reg(寄存器)或内存单元中。
(2)被除数:默认放在 AX 或 DX 和 AX 中,如果除数为8位,被除数则为16位,默认在AX中存放;如果除数为16位,被除数则为32位,在DX和AX中存放,DX存放高16位,AX存放低16位。
(3)结果:如果除数为8位,则AL存储除法操作的商,AH存储除法操作的余数;如果除数为16位,则AX存储除法操作的商,DX存储除法操作的余数。
当除数是8位时,被除数默认是一个16位数,存储在AX寄存器中。执行div指令后:
- 商存储在
AL
寄存器中。 - 余数存储在
AH
寄存器中。
例如:
mov ax, 1234h ; 将1234h放入AX作为被除数 mov bl, 10h ; 将10h放入BL作为除数 div bl ; 执行除法,AL得到商,AH得到余数
当除数是16位时,被除数是一个32位数,由DX
寄存器存放高16位,AX
寄存器存放低16位。执行div
指令后:
- 商存储在
AX
寄存器中。 - 余数存储在
DX
寄存器中。
例如:
mov dx, 00FFh ; 高16位放入DX mov ax, 1234h ; 低16位放入AX,构成32位被除数 mov bx, 100h ; 16位除数放入BX div bx ; 执行除法,AX得到商,DX得到余数
六、伪指令 dd
dd用来定义dword(双字)型数据
七、dup
dup(duplication的缩写)用来重复开辟内存空间。
dup指令要和db、dw、dd等数据定义伪指令配合使用,使用格式如下:
db 重复次数 dup (重复的字节型数据) dw 重复次数 dup (重复的字型数据) dd 重复次数 dup (重复的双字型数据)
例如,如下代码表示定义了9个字节:
db 3 dup (0,1,2) ;它们是0、1、2、0、1、2、0、1、2