相关英文缩写对照表
指令系统指微处理器能够完成的所有指令的集合8086/8088指令集共有115个指令助记符,代表着六大类共91种操作
一、数据传送指令
1、通用数据传送指令
MOV:
MOV DST, SRC
将源操作数SRC的一个字或字节,传送到目的操作数DST所指的单元。实质上是一种复制,SRC的内容并不改变。
SRC可以为:REG/SREG/DATA8/16 MEM
DST可以为:REG/SREG/MEM
传送指令不影响标志位
必须保证源目的操作数位数一致
DST因为要保存结果因此不能为立即数,也不能是CS
源和目的操作数不能同为存储器操作数 //要占用总线
不允许两个段寄存器之间传送数据
立即数不能直接送入段寄存器 //没有对应机械码
PUSH:
PUSH SRC
//操作包括SP自减2,压入操作数(先压入高八位在SP+1,低八位SP)
例:PUSH AX
POP:
POP DST
先将数据取出放入DST,SP自加2回收空间
//只能对字操作,另外POP CS不合法
XCHG:
XCHG OPR1,OPR2
将两个操作数互换,要求位长相同且不同时为MEM
可以实现寄存器之间或寄存器与存储器之间的数据交换,不允许使用段寄存器
例:XCHG BX,[BP+SI] //BP默认对应SS
XLAT(Translate):
AL<-BX+AL
XLAT指令可以把一种编码表示转换成另一种编码表示
XLAT指令使用前需要将编码表的首地址装入BX,将表的一个索引值装入AL
XLAT的实现过程:将BX的值加上AL作为有效地址EA,取出PA=(DS)x10H+EA所指存储单元的内容送到AL
2、地址目标传送指令
LEA(Load Effective Addesss to Register):
LEA REG, SRC
//(REG)<-EA 把源操作数的有效地址(偏移地址)传送给目的操作数
其源操作数必须是一个内存单元地址,目的操作数必须是16位通用寄存器
MOV BX, OFFSET TABLE Œ可以写为 LEA BX, TABLE。OFFSET速度较快,因为在汇编阶段就已经得出了偏移地址,然后被链接成了立即数传送指令,但是有局限性,只适用于简单变量或标号。
LDS(Load Pointer to DS):
双字节指针送寄存器和DS指令
LDS用于完成一个地址指针的传送,因为地址指针包括16位偏移地址和16位段地址,它们存储在由源操作数给出最低地址的四个连续存储单元中,其中低16位为偏移地址,高16位为段地址送入DS
LDS REG,SRC
(REG)<-(SRC)
(DS) <-(SRC+2)
将源操作数指定的存储器中4个连续字节分别传送到目的操作数和DS
注意低地址对应低字节,高地址高字节
LES(Load Pointer to ES):
功能与LDS类似,只是高字位装入ES
在使用LEA ,LDS, LES时目的操作数不能是段寄存器,源操作数必须是存储器寻址方式,三条指令均不影响标志位。
3、标志传送指令
LAHF (Load AH with Flags)
将标志寄存器低八位装入AH
SAHF (Store AH into Flags)
将AH内容存入标志寄存器低八位
PUSHF (Push Flags)
将16位标志寄存器压入堆栈保存
POPF (Pop Flags)
将当前SP所指内容弹入标志寄存器
附:标志寄存器回顾
4、I/O指令
IN(Input from)
IN ACC,PORT
ACC可以为AL或AX,PORT为输入端口地址。允许把一个字节由输入端口传送到AL中,或者把一个字由连续的输入端口传送到AX中。如果端口地址为8位时,可以直接用立即数 表示,超过8位则必须用DX寄存器来保存该端口的地址。
OUT(Output to)
OUT PORT, ACC
答:不可以,如果改成AL,只会输出数据的低八位。
二、算术运算指令
执行算术运算指令会运用到标志位
CF(Carry Flag 进位标志位“)
PF(Parity Flag 奇偶标志位“)
AF(Auxiliary Carry Flag 辅助进位标志,用于BCD码运算)
ZF(Zero Flag 零标志“)
SF(Sign Flag 符号标志“)
OF(Overflow Flag 溢出标志)‚
加减法指令
增量和减量指令
不改变进位标志CF
比较指令CMP
比较指令根据操作数相减的结果设置相应标志位(CF ZF),不改变操作数本身
乘除法指令
MUL U ;
AL×U(8位) → AX,(用于无符号数)
AX×U(16位) →DXAX
高半=0,则CF、OF=0,否则CF、OF=1;其余标志不定
IMUL U ;
操作与 MUL U 相同 (用于补码数)
DIV U ;
AX÷U(8位),商→AL,余数→AH,(用于无符号数)
DXAX÷U(16位),商→AX,余数→DX
所有标志不确定
IDIV U ; 操作与 DIV U 相同 (用于补码数)
BCD码调整指令
DAA:
隐含操作数AL
对压缩BCD码加法结果进行修正
BCD修正规则:
AL低(高)四位大于9 或 AF(CF)=1 , AL<-AL+06H(60H) AF(CF)<-1
例子:
BCD1 DB 45H
BCD2 DB 71H
MOV AL,BCD1
ADD AL,BCD2 //AL=B6H CF=0
DAA //AL=16H CF=1
DAS:
紧跟在SUB或SBB之后,对减法进行修正,同加法
扩展指令
CBW:
原操作数AL,目的操作数AX
将AL中的一个字节的带符号数扩展成一个字
AL < 80H (即D7 = 0) , (AH) 00H
AL > =80H (即D7 = 1) , (AH) 0FFH
CWD:
原操作数AX,目的操作数DX,AX
AX< 8000H (即D15 = 0) , (DX) 0000H
AX> =8000H (即D15 = 1) , (DX) 0FFFFH
CBW和CWD指令一般用于带符号数除法指令之前
位处理指令
AND 与 、OR 或、XOR 异或:
运算结果保存到目的操作数,同时将CF设为零
TEST:
同AND的操作,但不改变目的操作数,可以用来判断某一位是否为零
SHL/SHR:
逻辑左移/右移
SAL/SAR:
算术左移/右移
算数左移同逻辑左移,算术右移为补最高位右移(如图)
例如 :
补码为1000 0010(原码-111 1100即-124)
SAR之后为1100 0001(原码-011 1110 即-62)
右移一位相当于带符号数算术上除以2,所以称为算术右移
ROL/ROR:
循环左移/右移
将最高(低)位移到最低(高),并保存在CF中
RCL/RCR
带进位位的循环左移,右移(用来计算)
串操作指令
所用寄存器已经约定。源地址DS SI 目的地址ES DI
程序转移指令
无条件转移JMP:
段内直接转移SHORT
段内直接转移NEAR
段内间接转移 寄存器
例如:
机器码FFE1
操作数为E1 (1110 0001)后三位为001所以对应寄存器为CX
等同于JMP CX(IP<-CX)
段内间接转移 存储器
段间直接转移
例子:
JMP WORD PTR [BX] //段内直接转移,CS不变,送[BX]到IP
JMP DWORD PTR [BX] //段间直接转移,CS存高位,IP存低位
无条件转移CALL:
用来调用一个子过程,与JMP的区别在于,CALL指令保存了断点(硬件自动实现)
段间调用:先将CS压入堆栈,SP=SP-2,然后将IP压入堆栈,SP=SP-2
段内调用:只将IP压入堆栈,SP=SP-2
无条件转移RET:
返回指令,子程序返回主程序,恢复断点。
条件转移指令
标志位操作指令