引言
每个存储单元只有一个物理地址,但它可由不同的段基址和偏移地址组成。物理地址 = 段基址 * 16 + 偏移地址
一 寻址方式
借用MOV指令来讲解寻址方式。MOV指令:将后面的赋值给前面的,后面的东西并不会受到影响。
1.1 立即寻址
相当于不用寻址,数字就在眼前。
将后面的数字直接赋值给前面寄存器。
MOV BL,66H
MOV AX,66H
MOV AX,1234H
后面的数字称为立即数,立即数的位数(bit)不能超过寄存器的位数。
立即数只能作源操作数,不能作目的操作数。
1.2 寄存器寻址
数字在CPU的寄存器中,而寄存器的名由指令指出。
将后面的寄存器中的值赋值给前面寄存器。
MOV AX,BX
两个寄存器的位数必须相同。
1.3 直接寻址
操作数有效地址(16位或32位)直接包含在指令中。如果指令无前缀指明在哪一段中,则默认操作数存放在数据段。
MOV AX,[2000H] ;DS段2000H的内容送AL,2001H的内容送AH
MOV AX,ES:[2000H] ;ES段2000H的内容送AL,2001H的内容送AH
1.4 寄存器间接寻址
无前缀则默认操作数存放在堆栈段:[BP],[EBP],[ESP]
其他的寄存器无前缀则默认操作数存放在数据段。
其实和上面的直接寻址相同,只不过地址存放在寄存器中而不是直接给出。
MOV AX,[BX] ; AX = (DS*10H+(BX))
MOV AX,[BP] ; AX = (SS*10H+(BP))
MOV AX,ES:[BX] ; AX = (ES*10H+(BX))
MOV AX,DS:[BP] ; AX = (DS*10H+(BP))
1.5 相对寄存器间接寻址
MOV AX,2040H[BX] ;将DS段(BX+2040H)的内容送给AX
MOV AX,[BX+2040H] ;和上面相同
1.6 基址加变址寻址
16位寻址
基址寄存器:BX、BP
变址寄存器:DI、SI
MOV AX,[BX+SI] ;将DS段(BX+SI)的内容送给AX
MOV AX,[BX][SI];和上面相同
32位寻址
基址寄存器:任何一个32位通用寄存器
变址寄存器:除ESP之外的任一个32位通用寄存器
MOV AX,[EBX+ECX] ;将DS段(EBX+ECX)的内容送给AX
MOV AX,[EBX][ECX];和上面相同
1.7 相对基址加变址寻址
[基址寄存器]+[变址寄存器]+偏移量
MOV AX,1234H[BX+DI]
MOV AX,[BX+DI+1234H]
MOV AX,1234H[BX][DI]
DS段(BX)+(DI)+1234H中的数据赋值给AX
1.8 小结
上面这么多种寻址方式,其实说白了只有两种:内容、地址。
只要区分是内容还是地址就行了。
带中括号的都是地址,不带中括号的都是内容。
二 指令系统
2.1 指令格式
指令格式: [标号:] 操作码 [操作数,…] [;注释]
其中: 标号:确定汇编语句的位置,提供跳转、循 环的目标。 操作码:汇编语句操作。 操作数:操作数据项,数目因操作码而异。 注释:程序注解。 如:START:MOV AX,DATA MOV DS,AX ;设置DS
2.2 指令种类
整数指令:数据传送、算术运算、逻辑 运算与移位、串操作、位操作指令、控 制转移、标志操作、 按条件设置字节、 处理器控制指令、高级语言指令等 –浮点数指令:数据传送、算术运算、比 较、超越函数、常量、控制等指令 –操作系统型指令
2.3 指令操作数符号说明
OP1,OP2,OP3:操作数
reg :通用寄存器。长度可以是8位、16位、32位
Sreg :段寄存器(段选择符)
reg8 :8位通用寄存器
reg16 :16位通用寄存器
reg32 :32位通用寄存器
mem :存储器。长度可以是8位、16位、32位
mem8 :8位存储器
mem16 :16位存储器
mem32 :32位存储器
imm :立即数。长度可以是8位、16位、32位
imm8 :8位立即数