80x86指令系统
指令格式
1.指令的书写格式
标号: 指令助记符 操作数 ; 注释
2.操作数的3种形式:
立即操作数:指令的操作数是立即数,并直接出现在指令中。
寄存器操作数:操作数是寄存器的值,指令中使用寄存器名。
内存操作数:操作数是某个内存单元的值,指令中给出有效地址EA,段地址在某个段寄存器中。
8086指令的操作数形式
1.立即数: 8位或16位立即数。
2.寄存器操作数:
8位/16位通用寄存器和段寄存器(除了FS和GS)。
3.内存操作数
包括下列几种形式。
Variable 或 [Variable]
[reg]
disp[reg]
[base][index]
disp[base][index]
?***说明:
Variable是变量名或变量名 ± 整数表达式。
reg为BX、BP、SI、DI。
disp可以是常量或变量,汇编后为一个常数,若是变量,则取其偏移地址。
base为BX或BP,index为SI或DI。
有效地址为各项之和。如disp[base][index]形式,EA = base + index + disp。
若使用了BP,则隐含段地址在SS,否则在DS。
当段地址不在隐含的段寄存器时,可使用段超越前缀,形式为:段寄存器名:
32位CPU扩展的操作数形式
1.立即数: 32位立即数。
2.寄存器操作数: 32位通用寄存器以及FS和GS。
3.内存操作数
包括下列几种形式。
[base]
disp[base]
[base][index]
disp[base][index]
[index*n]
disp[index*n]
[base][index*n]
disp[base][index*n]
***说明:
base、index为任一32位通用寄存器(index不能取ESP)。
n为比例因子,取1、2、4或8。
若包含base且base为EBP或ESP,则隐含段地址在SS;否则,隐含段地址在DS。
若在16位CPU上编程,则不能使用这些寻址方式。
指令系统
为了描述方便,采用下列符号约定:
dest — 目的操作数
src — 源操作数
oprdn — 第n个操作数,如oprd1, oprd2, oprd3
= — 赋值
/ — 或者
reg8 — 8位通用寄存器AH/AL/BH/BL/CH/CL/DH/DL
reg16 — 16位通用寄存器AX/BX/CX/DX/SI/DI/BP/SP
reg32 — 32位通用寄存器EAX/EBX/ECX/EDX/ESI/EDI/EBP/ESP
reg — reg8/reg16/reg32
seg — 段寄存器CS/DS/SS/ES/FS/GS
mem8 — 8位内存操作数
mem16 — 16位内存操作数
mem32 — 32位内存操作数
mem — mem8/mem16/mem32
mem64 — 64位内存操作数
imm8 — 8位立即数
imm16 — 16位立即数
imm32 — 32位立即数
imm — imm8/imm16/imm32
数据传送指令
1. MOV ( Move ):传送
一般形式:
MOV dest, src ; dest = src。将源操作数src复制到目的操作数dest,src不变。
语法格式:
MOV reg/mem/seg, reg