80x86寻址方式与子程序
指令系统的一般概念
指令: 控制计算机完成指定操作的命令
机器指令:指令的二进制代码形式。
例如:CD21H
汇编指令:助记符形式的指令。
例如:INT 21H
指令系统:CPU所有指令及其使用规则的集合
指令的基本构成
操作码 [目的操作数],[源操作数]
操作码:说明要执行的 是什么操作
操作数:操作对象,可以 有0个、1个或2个
80x86的寻址方式
立即寻址
- 操作数(为一常数)直接由指令给出 (此操作数称为立即数)
- 立即寻址只能用于源操作数,且源操作数长度和目的操作 数长度相等
MOV AX, 1C8FH
MOV BYTE PTR[2A00H], 8FH
指令操作例:
MOV AX,3064H
AX <- 3064H
执行后:(AH) = 30H,(AL) = 64H
寄存器寻址
- 操作数放在某个寄存器中
- 源操作数与目的操作数字长要相同
- 寄存器寻址与段地址无关
MOV AX, BX
MOV ECX, EDX
直接寻址
- 指令中直接给出操作数的32位偏移地址
- 偏移地址也称为有效地址(EA, Effective Address)默认的段寄存器为DS,但也可以显式地指定其他 段寄存器——称为段跨越前缀
- 偏移地址也可用符号地址来表示,如ADDR、VAR
MOV AX , [2000H]
寄存器间接寻址
- 操作数的偏移地址(有效地址EA)放在寄存器中,操作数在存储器中
- 32位寻址时,可用寄存器EAX、EBX、ECX、EDX、 ESP、EDP、ESI、EDI等8个通用寄存器。ESP、EBP等 寻址寄存器的默认段为SS段,其他寄存器的默认段 为DS寄存器
- 16位寻址时,可用寄存器SI、DI、BX和BP
MOV AX, [EBX]
MOV CL, CS:[EDI];CS指定其他段 错误例
寄存器相对寻址
- EA=基址或变址寄存器的内容加指令中指定的位移量
- 16位寻址时,可用寄存器:SI、DI、BX和BP
- 32位寻址时,可用寄存器:EAX、EBX、ECX、EDX、 ESP、EDP、ESI、EDI等8个通用寄存器。ESP、EBP等寻 址寄存器的默认段为SS段,其他寄存器的默认段为DS寄 存器。 常用于存取表格或一维数组中的元素——把表格的起始 地址作为位移量,利用修改基址或变址寄存器的内容 来取得表格中的值
MOV AX, [EBX+8]
基址-变址寻址
若操作数的偏移地址:
- 由基址寄存器(BX或BP)给出 —— 基址寻址方式
- 由变址寄存器(SI或DI)给出 —— 变址寻址方式
由一个基址寄存器的内容和一个变址寄存器的内 容相加而形成操作数的偏移地址,称为基址-变址 寻址
同一组内的寄存器不能同时出现
MOV AX, [EBX] [ESI]
MOV AX, [EBX+ESI]
MOV AX, DS: [EBP] [EDI]
MOV EDX, [EBX] [ESI]
相对的基址-变址寻址
- 在基址-变址寻址的基础上再加上一个相对位移量
- 注意事项同基址–变址寻址
- 这种寻址方式通常用于二维数组的寻址。
MOV AX,BASE [EBX] [ESI]
MOV AX,[BASE +EBX] [ESI]
MOV AX,[BASE + EBX+ESI]
寻址格式:DATA[reg1][reg2] =[DATA+reg1+reg2]