u指令格式
Ø机器语言指令格式
8086指令系统采用1到6个字节组成的变字长指令格式,有操作码、寻址方式、操作数三部分组成,如下图,
一般是指令的第1个字节为操作码,规定指令的操作类型。第2个字节规定操作数的寻址方式,第3到6字节是可变字节,指出存储器操作数地址的位移量或立即数。
Ø汇编语言指令格式
汇编语言指令的基本格式:操作助记符 目的操作数 源操作数
操作助记符指出计算机进行什么样的操作;目的操作数有两个作用——参于指令操作与暂存操作结果。除立即寻址方式外,其他寻址方式均适用于目的操作数。源操作数提供原始数据或操作对象,面向所有寻址方式。
u寻址方式
1.数据寻址方式
1)立即寻址方式中,指令操作码和操作数都在存储器代码段中。
汇编格式:n(n为立即操作数,是用8位或16位二进制补码表示的有符号数)
功能:操作数存放在存储器,指令下一单元的内容为立即操作数n。
图形表示:
指令 |
n |
2)寄存器寻址方式的操作数在指令指明的寄存器中。
汇编格式:R,其中R表示寄存器名。
功能:操作数直接存放在寄存器R中。
3)变址寻址方式操作数的偏移地址EA为寄存器的内容加位移量,操作数在存储器中。
汇编格式:X[R](X表示位移量,是8位或16位二进制补码表示的有符号数)
功能:操作数存放在存储器,寄存器R的内容加位移量X为操作数的偏移地址EA。
图形表示:
4)寄存器间接寻址方式中,寄存器的内容为操作数的偏移地址EA,操作数在存储器中。
汇编格式:[R]
功能:操作数存放在存储器,寄存器R存放操作数的偏移地址EA。
5)寄存器相对寻址
寄存器相对寻址指的是操作数的偏移地址是一个基址寄存器或变址寄存器加上指令中给出的8位或16位位移量。
实际上就是在寄存器间接寻址的基础上,再加上一个位移量。
6)基址变址寻址
基址变址寻址方式中,操作数的偏移地址EA是指令中基址寄存器内容与变址寄存器内容的和。
7)基址变址相对寻址
基址变址相对寻址方式中,操作数的偏移地址EA是指令中基址寄存器内容、变址寄存器内容、位移量X三项之和,操作数在存储器中。
汇编格式:X [BR+IR]
功能:操作数存放在存储器,BR的内容加IR的内容加位移量X是操作数的偏移地址EA。
图形表示:
8)I/O端口寻址
I/O端口寻址有两种:直接端口寻址与间接端口寻址。
u 转移地址寻址方式
1)段内直接寻址:程序转移的有效地址是当前IP内容加上指令中给出的8位或16位位移量。当位移量为8位时,称为短转移,在符号地址前加操作符SHORT;当位移量为16位时,称为近转移,在符号地势前加操作符NERAPTR。
2)段内间接寻址:程序转移的有效地址是在寄存器或存储单元中。
3)段间直接寻址:与段内直接寻址不同,在指令中给出了转移地址的段地址和偏移地址的内容。
4)段间间接寻址:类似于段内间接寻址,只是在间接寻址时转移地址必须放入存储单元中。
u MOV ( Move ):传送
Ø 一般形式
MOV dest, src; dest = src。将源操作数src复制到目的操作数dest,src不变。
Ø 语法格式
MOV reg/mem/seg, reg/mem/seg/imm
对标志位的影响:无。
Ø 说明
dest与src不能作如下搭配:
MOV mem, mem ; 错误
MOV seg, seg ; 错误
MOV seg, imm ; 错误
dest不能是CS。
dest与src必须类型匹配,即同时是字节、字或双字类型。
u MOVSX
Ø 一般形式
MOVSX dest, src; src符号扩展为dest;386新增
语法格式:
MOVSX reg16, reg8/mem8
MOVSX reg32, reg8/mem8/reg16/mem16
Ø 功能描述
MOVSX是CBW、CWD和CWDE的一般形式,用来将8位数符号扩展为16位或32位数,或者将16位数符号扩展为32位数。
Ø 例
CBW和CWDE的功能可由MOVSX指令实现。
movsx ax, al ; 等价于cbw
movsx eax, ax ; 等价于cwde
movsx eax, al ; 等价于顺序执行cbw与cwde
u XCHG ( Exchange ):交换
Ø 一般形式:
XCHG oprd1, oprd2; 交换oprd1与oprd2的内容
Ø 语法格式:
XCHG reg/mem, reg/mem
对标志位的影响:无。
Ø 说明:
oprd1与oprd2不能作如下搭配:
XCHG mem, mem ; 错误
oprd1与oprd2类型必须匹配。
Ø 例
xchg ebx, edx
xchg [ebp][eax*4], edx
u 堆栈操作指令
Ø 80x86系统的堆栈具有如下特点:
堆栈是在内存的堆栈段中,具有“先进后出”的特点。
堆栈只有一个出入口,即当前栈顶。当堆栈为空时,栈顶和栈底指向同一内存单元。
堆栈有两个基本操作:PUSH(进栈)和POP(出栈)。PUSH操作使栈顶向低地址方向移动,而POP操作则刚好相反。
堆栈操作只能以字或双字为单位。
SS:SP指向栈顶。
Ø PUSH与POP:进栈与出栈
语法格式:
PUSH reg16/seg/mem16/ reg32/mem32
POP reg16/seg/mem16/ reg32/mem32; 操作数不能是CS
PUSH imm; 286新增
功能描述:
PUSH指令(16位):
SP = SP - 2
SS:[SP] = 16位操作数
POP指令(16位):
16位操作数 = SS:[SP]
SP = SP + 2
PUSH指令(32位):
SP = SP - 4
SS:[SP] = 32位操作数
POP指令(32位):
32位操作数 = SS:[SP]
SP = SP + 4
对标志位的影响:无。
Ø PUSHF与POPF:标志寄存器进栈和出栈
语法格式:
PUSHF ; FLAGS进栈
POPF ; 栈顶字出栈到FLAGS
对标志位的影响:只有POPF指令会以弹出值设置标志寄存器。
例
设SP = 100H, EBX = 12345678H, 给出下列指令依次执行后的结果。
push bx; ss:[00ffh] = 56h, ss:[00feh] = 78h, sp = 0feh
pop ax; ax = 5678h, sp = 100h
push ebx; ss:[00feh] = 1234h, ss:[00fch] = 5678h, sp = 0fch
pop ax; ax = 5678h, sp = 0feh
pop ax; ax = 1234h, sp = 100h
【例】交换AX与CX的值。
push ax
push cx
pop ax
pop cx
u 符号扩展与零扩展指令
对标志位的影响:无。
(1)CBW、CWD、CWDE与CDQ
语法格式:
CBW; AL符号扩展为AX
CWD; AX符号扩展为32位数DX:AX
CWDE; AX符号扩展为EAX;386新增
CDQ; EAX符号扩展为64位数EDX:EAX;386新增
【例】设AL = 0FEH,给出依次执行下列指令后的结果。
cbw; ax = 0fffeh
cwd; dx = 0ffffh, ax不变,即dx:ax = -2
cwde; eax = 0fffffffeh(-2)
cdq; edx = 0ffffffffh, eax不变,即edx:eax = -2
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于