第3-3章 80X86指令系统
(能被CPU直接执行的指令组成的有机整体)
包括:
- 数据传送指令
- 算术指令
- 逻辑指令
- 串处理指令
- 控制转移指令
- 处理机控制与杂项操作指令
重点关注:
汇编格式、基本功能、支持的寻址方式、对标志位的影响、特殊要求
汇编格式
操作码 | [(目标)操作数] | [(源)操作数] | …… | [(源)操作数] |
如:1)MOV AH, [2000H]
2)PUSH [2000H]
3)RET
数据传送指令
- 通用数据传输指令(通用寄存器都可以用,如AX,AL,SP等):MOV、PUSH、POP、XCHG
传送指令:MOV DST,SRC 执行操作:(DST)←(SRC)
1)DST、SRC不能同时为段寄存器(DS、ES等)
2)立即数不能直接送段寄存器 MOV DS,1234H ×
3)不允许使用AX、CX、DX存放EA(有效地址),BX允许
4)DST不能是立即数和CS寄存器
5)DST、SRC不能同时为存储器寻址(存储器单元不能直接传送数据,因为位宽不一定能匹配)
不影响标志位
进栈指令、出栈指令:PUSH SRC 执行操作:先SP←SP-2,后(SP+1),(SP)←(SRC)
POP DST 执行操作:先(DST)←(SP+1),(SP),后SP←SP+2
1)堆栈是操作系统分配的先进后出的存储区,段地址存放在SS寄存器中
2)低地址靠近栈顶,高地址靠近栈底
3)SP寄存器在任何时候都指向栈顶,进出栈后自动修改SP
4)堆栈操作必须以字为单位(即SP每次移动2字节,要修改单字节时运用AH、AL)
5)DST不能是CS寄存器,SRC和DST都不能是立即数 PUSH 1234H × POP 1234H ×
不影响标志位
交换指令:XCHG OPR1,OPR2 执行操作:(OPR1)↔(OPR2)
1)不允许使用段寄存器
2)两个操作数至少有一个在寄存器中,不能都是内存(内存间不能直接传送数据)
不影响标志位
- 累加器专用传送指令(只限定使用AX寄存器):IN、OUT、XLAT
输入指令:AX是目标操作数,源操作数是PORT(I/O设备端口号的8位立即数)或DX,执行操作为:CPU←I/O
长格式:IN AL,PORT 执行操作:AL←(PORT) 字节
IN AX,PORT 执行操作:AX←(PORT+1),(PORT) 字
短格式:IN AL,DX 执行操作:AL←(DX) 字节
IN AX,DX 执行操作:AX←(DX+1),(DX) 字
(测试端口27H的第2位是否为1:
IN AL,27H
TEST AL,00000100B (与运算后更新标志寄存器,00000001B时测试第0位)
JNZ ERROR)
输出指令:目标操作数是PORT或DX,AX是源操作数,执行操作为:I/O←CPU
长格式:OUT PORT,AL 执行操作:(PORT)←AL 字节
OUT PORT,AX 执行操作:(PORT+1),(PORT)←AX 字
短格式:OUT DX,AL 执行操作:(DX)←AL 字节
OUT DX,AX 执行操作:(DX+1),(DX)←AX 字
(输入指令与输出指令都要注意)
1)通过指定的端口号从I/O设备输入或输出数据
2)前256个端口号00H~0FFH可直接用长格式指定(PORT限定8位)
3)端口号大于0FFH则要存储到DX中,再用短格式指定
不影响标志位
换码指令:XLAT 或 XLAT OPR 执行操作:AL←(BX+AL)
BX寄存器中存放表格的首地址,将该首地址偏移AL后的内存内容赋给AL
(例:MOV BX,OFFSET TABLE ;将变量TABLE的偏移地址送到BX,等价于LEA BX,TABLE
MOV AL,3
XLAT
AL的内容从3映射到了表格的3号位的内容)
1)字节表格(长度<=256)
2)首地址→BX,偏移量→AL
3)有操作数时,自动将OPR赋给BX
不影响标志位
- 地址传送指令:LEA、LDS、LES
有效地址送寄存器指令:LEA REG,SRC 执行操作:REG←SRC
指针送寄存器和DS指令:LDS REG,SRC 执行操作:REG←(SRC),同时DS←(SRC+2)
指针送寄存器和ES指令:LES REG,SRC 执行操作:REG←(SRC),同时ES←(SRC+2)
都要注意:
1)地址MEM长为16位,用两个字节存储
2)指针占4字节,高位的2字节16位的存储段地址,低2位16位的存储偏移地址
3)REG不能是段寄存器,SRC必须是寄存器寻址方式
不影响标志位
- 标志寄存器传送指令:LAHF、SAHF、PUSHF、POPF
标志传送AH指令:LAHF 执行操作:AH←(FLAGS的低字节)
根据第2章标志寄存器的结构可知,该指令将SF、ZF、AF、PF、CF五个标志位传至AH的第7、 6、4、2、0位,第5、3、1位未定义
AH送标志寄存器指令:SAHF 执行操作:(FLAGS的低字节)←AH
标志进栈指令:PUSHF 执行操作:先SP←SP-2,后(SP+1),(SP)←(FLAGS)
标志出战指令:POPF 执行操作:先(FLAGS)←(SP+1),(SP),后SP←SP+2
影响标志位
- 其他