约定描述性符号:reg
和 sreg
。
使用 reg
符号来表示一个普通寄存器,使用 sreg
符号来表示一个段寄存器。
reg 符号集:AX(AH/AL)、BX(BH/BL)、CX(CH/CL)、DX(DH/DL)、SP、BP、SI、DI;
sreg 符号集:DS、SS、CS、ES。
BP、ES寄存器
BP 是基指针寄存器,和 BX 类似,也可以用于暂存数据,也是通用寄存器。
在“ [BP]
”中使用寄存器 BP ,而指令中没有显式给出段地址,则段地址默认保存在 SS 段寄存器中。“ [BP]
”会被解释为“ SS:BP
”。
在8086CPU中,只有 BX 、SI 、DI 和 DP 可以在“ […]
”中来进行内存单元的寻址。
这四个寄存器可以单独出现,但只能以以下四种组合出现:
- BX 和 SI
- BX 和 DI
- BP 和 SI
- BP 和 DI
其余组合都是错误的形式。
ES 是附加段寄存器,和其余段寄存器类似。当程序中如果除了数据、栈和代码外还需要其余的段,可以使用ES寄存器。
数据位置的表达
汇编语言用3个概念来表达数据的位置:
- 立即数(immediate operand):对于直接包含在机器指令中的数据,在汇编语言中称为立即数,在汇编指令中可以直接给出。
以H结尾的十六进制数据,以B结尾的二进制数据,以单引号引出的字符数据,都是立即数。
立即数在指令执行前,数据位于CPU的指令缓冲器中。
- 寄存器:指令要处理的数据在寄存器中,在汇编指令中给出相应的寄存器名。
- 段地址(SA)和偏移地址(EA):指令要处理的数据在内存中时,在汇编指令中用“
[…]
”的格式给出偏移地址,而段地址在某个段寄存器中。
存放段地址的寄存器如果没有显式给出,那么使用对应默认的段寄存器。也可以用段前缀的形式显式给出段寄存器。
寻址方式
下表总结了8086CPU的寻址方式:
寻址方式 | 含义 | 名称 | 常用格式举例 |
---|---|---|---|
[n] |
DS:n |
直接寻址 | [n] |
[BX] |
DS:BX |
寄存器间接寻址 | [BX] |
[SI] |
DS:SI |
||
[DI] |
DS:DI |
||
[BP] |
DS:BP |
||
[BX+n] |
DS:BX+n |
寄存器相对寻址 | 用于结构体:[BX].n 用于数组: n[SI] 用于二维数组: [BX][n]
|
[SI] |
DS:SI |
||
[DI] |
DS:DI |
||
[BP] |
DS:BP |
||
[BX+SI] |
DS:BX+SI |
基址变址寻址 | 用于二维数组:[BX][SI] |
[BX+DI] |
DS:BX+DI |
||
[BP+SI] |
SS:BP+SI |
||
[BP+DI] |
SS:BP+DI |
||
[BX+SI+n] |
DS:BX+SI+n |
相对基址变址寻址 | 用于结构中的数组项:[BX].n
用于二维数组:n[BX][SI] |
[BX+DI+n] |
DS:BX+DI+n |
||
[BP+SI+n] |
SS:BP+SI+n |
||
[BP+DI+n] |
SS:BP+DI+n |
处理数据的位数
8086CPU的指令可以处理字节和字的数据。在机器指令中要指明指令处理的是字操作还是字节操作。汇编语言用以下方式处理该问题:
- 通过寄存器名指明要处理数据的单位:
当指令中出现16位寄存器时,表明指令中进行的是字操作;当指令中出现8位寄存器时,表明指令中进行的是字节操作。
- 在没有寄存器名存在的情况下,用操作符关键字 ptr 指明内存单元的长度。该关键字需要跟在数据单位关键字 word 或 byte 后。
例如,以下指令使用 word ptr
指明了指令访问的内存单元是一个字单元:
以下指令使用 byte ptr
指明了指令访问的内存单元是一个字节单元:
- 其它方法:有些指令(例如 PUSH )默认了访问的是字单元还是字节单元。
DIV指令和dd、dup伪指令
DIV
container
,
number
container
对应的寄存器或存储空间中的值作为除数进行除法运算。除数可以是8位数或16位数。被除数默认放在 AX ,或 DX 和 AX 中:
- 如果除数为8位,那么被除数为16位,默认在 AX 中存放;
- 如果除数为16位,那么被除数为32位,在 DX 和 AX 中存放,DX 中存放高16位,AX 中存放低16位。
除法运算的结果为:
- 如果除数为8位,则 AL 寄存器存储除法操作的商,AH 寄存器存储除法操作的余数;
- 如果除数为16位,则 AX 寄存器存储除法操作的商,DX 寄存器存储除法操作的余数。
可以用伪指令 dd 来定义dword(double word 双字)型数据。双字型数据占两个字的空间(32位)。
双字型数据一般用作被除数的存储。
dd 伪指令的使用类似于 db 和 dw ,例如:
dup 是一个操作符,和 db 、dw 、dd 等伪指令配合使用,用来进行数据的重复。
dup 的使用格式为:
- db times dup (byte data)
- dw times dup (word data)
- dd times dup (dword data)
dup 可以将括号内的对应类型的数据重复 times 次。例如:
dup 可以快速定义一块需要的内存空间,例如: