汇编语言基础8086汇编指令.docx
《汇编语言基础8086汇编指令.docx》由会员分享,可在线阅读,更多相关《汇编语言基础8086汇编指令.docx(13页珍藏版)》请在冰豆网上搜索。
汇编语言基础8086汇编指令
微处理器指令系统
概述:
一台计算机所能识别和执行的全部指令,称为该机器的指令系统,又称指令集。
一般指令分为:
“告诉计算机干什么”的指令操作助记符,“指令操作对象”即操作数。
寻址方式
概述:
指定操作数或操作数存放位置的方法称为寻址方式。
8086的寻址方式有三类:
立即寻址、寄存器寻址和存储器寻址;其中存储器寻址又分为直接寻址、寄存器间接寻址、寄存器相对寻址、基址加变址寻址、相对基址加变址寻址五种。
立即寻址:
操作数直接写在指令中的寻址方式,因为这种操作数称为立即数,所以这种寻址方式也称为立即数寻址方式。
立即数可以使8位;16位;32位;
例如:
MOVAX,6789HADDAX,1234H
寄存器寻址:
指令所要的操作数事先已存储在某寄存器中,或把目标操作数存入寄存器中,或者源操作数和目标操作数都是寄存器。
例如:
MOVAX,BXMOVAX,6789H(源操作数是立即数寻址,目的操作数是寄存器寻址)
存储器寻址:
在存储器中查找操作数。
1·直接寻址方式:
指令所要的操作数存放在内存中,在指令中直接给出操作数的段地址和有效地址,从而使8086的BIU部件能够利用地址加法器得到实际物理地址。
例如:
MOVAX,DS:
[2000H](mov默认DS为存放数据的段,所以这个指令等价于MOVAX,[2000H])
MOVAX,ES:
[2000H]
2·寄存器间接寻址方式:
操作数在存储器中,操作数的有效地址用SI,DI,BX,BP4个集训期之一来指定。
若不使用段前缀,则规定若有效地址用SI,DI,BX等之一来指定,则默认的段寄存器是DS,若有效地址用BP来指定,则其默认的段寄存器位SS。
例如:
MOVBX,[DI]
3·寄存器相对寻址方式:
操作数的有效地址是一个基址寄存器(BX,BP)或变址寄存器(SI、DI)的内容和指令中的8/16位偏移量之和。
例如:
MOVBX,[SI+100H]
4·基址加变址寻址方式:
操作数有效地址是一个基址寄存器(BX,BP)和一个变址寄存器(SI,DI)的内容之和。
(不要混淆基址寄存器和变址寄存器)
例如:
MOVBX,[BX,DI]
5·相对基址加变址寻址方式:
操作数有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8/16位偏移量之和。
例如:
MOVAX,[BX+DI+1234H]
32位地址的寻址方式
在用16位寄存器来访问存储单元时,只能使用基地址寄存器(BX和BP)和变址寄存器(SI和DI)来作为地址偏移量的一部分,但在32位寄存器寻址时,不存在上述限制,所有32位寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP)都可以是地址偏移量的一个组成部分。
8086指令
概述:
指令系统确定了CPU所能完成的功能,是用汇编语言进行程序设计的最基本部分。
分类:
数据传送指令,标志位操作指令,算术运算指令,逻辑运算指令,移位操作指令,比较运算指令,循环指令,转移指令,条件设置字节指令,字符串操作指令,ASCII-BCD码运算调整指令,处理器指令。
基本格式:
指令助记符[操作数1[,操作数2[,操作数3]]](指令助记符体现该指令的功能,它对应一条二进制编码的机器指令)。
数据传送指令:
1·MOV:
传送指令,这是使用最频繁的指令,它相对于高级语言的赋值语句。
格式:
MOVReg/Mem,Reg/Mem/Imm
(Reg---Register寄存器,Mem---Memory存储器,Imm---Immediate立即数)
使用规定:
1·两个操作数的数据类型要相同;2·两个操作数不能同时为段寄存器;3·代码段寄存器CS不能为目的操作数,但可作为源操作数;4·立即数不能直接传给段寄存器;5·立即数不能作为目的操作数;6·指令指针IP,不能作为MOV指令的操作数;7·两个操作数不能同时为存储单元。
2·XCHG:
交换指令,是两个寄存器之间,寄存器和内存变量之间进行数据交换的指令,两个操作数的数据类型要相同。
格式:
XCHGReg/Mem,Reg/Mem
3·LEA:
取有效地址指令,是把一个内存变量的有效地址送给指定的寄存器。
格式:
LEAReg,Mem
4·LDS/LES/LFS/LGS/LSS:
装载段寄存器指令,把内存中地址的“低字”传送给指令中指定的16位寄存器,把随后的“高字”传给相应的寄存器(DS、ES、FS、GS、SS);
格式:
LDS/LES/LFS/LGS/LSSReg,Mem
5·PUSH/POP:
堆栈操作指令,堆栈是一个重要的数据结构,具有“先进后出”的特点,通常用来保存程序的返回地址。
PUSH:
进栈指令;
格式:
PUSHReg/Mem
POP:
出栈指令
格式:
POPReg/Mem
6·标志寄存器传送指令
A·LAHF:
标志送AH指令,FLAGS的低8位送AH。
格式:
LAHF
B·SAHF:
AH送标志寄存器指令,AH值送FLAGS的低8位
格式:
SAHF
C·PUSHF/PUSHFD:
标志寄存器进栈指令,把16/32位标志寄存器进栈
格式:
SAHF
D·POPF/POPFD:
标志寄存器出栈指令,把栈顶的16/32位数据出栈给标志寄存器。
7·XLAT:
转换指令,把给出的指令中明确给出的内存地址或默认的BX值作为内存字节数组首地址、下标为AL的数组元素的值传送给AL。
这个指令可以给出一个内存地址作为操作数,也可以没有形式上的操作数,但有两个隐含操作数BX和AL。
格式:
XLATMem或XLAT
8·IN、OUT:
I/.O指令,访问io端口的指令。
A·输入指令IN:
从端口中读入一个字节或字,并保存在寄存器AL或AX中。
格式:
INAL/AX,Port/DX
B·输出指令OUT:
把寄存器AL或AX的内容输出到指定端口。
格式:
OUTPort/DX,AL/AX
加法指令
1·ADD:
加法指令,把源操作数的值加到目的操作数中。
格式:
ADDReg/Mem,Reg/Mem
受影响的标志位:
AF、CF、OF、PF、SF、ZF
2·ADC:
带进位的加指令,把源操作数和进位标志位CF的值一起加到目的操作数中。
格式:
ADCReg/Mem,Reg/Mem/Imm
受影响的标志位:
AF、CF、OF、PF、SF、ZF
3·INC:
加一指令,把源操作数的值加1
格式:
INCReg/Mem
受影响的标志位:
AF、OF、PF、SF、ZF,不影响CF
减法指令
1·SUB:
减法指令,从目的操作数中减去源操作数
格式:
SUBReg/Mem,Reg/Mem/Imm
受影响标志位:
AF、CF、OF、PF、SF、ZF
2·SBB:
带借位的减,把源操作数和标志位CF的值从目的操作数中一起减去
格式:
SBBReg/Mem,Reg/Mem/Imm
受影响的标志位:
AF、CF、OF、PF、SF、ZF
3·DEC:
减1指令,把源操作数减去1
格式:
DECReg/Mem
受影响的标志位:
AF、OF、PF、SF、ZF,不影响CF
4·NEG:
求补指令,改变操作数的正负号
格式:
NEGReg/Mem
受影响的标志位:
AF、CF、OF、PF、SF、ZF
5·CMP:
比较指令,用第二个操作数减去第一个操作数,根据差设置有关标志位。
影响ZF标记位,比较的两者相同则ZF为1。
乘法指令
隐含的操作数是被乘数,乘数在指令中显示的写出来。
CPU会根据乘数是8位、16位、还是32位操作数,来自动选用被乘数:
AL、AX或EAX
1·MUL:
无符号数乘法指令,把显示操作数和隐含操作数(都作为无符号数)想乘。
格式:
MULReg/Mem
受影响的标志位:
CF和OF(AF、PF、SF和ZF无定义);
2·IMUL:
有符号数乘法指令,具有符号运算,其余和MUL相同
格式:
IMULReg/Mem
除法指令
隐含的操作数是被除数,除数在指令中显示的写出来.CPU会根据除数是8位、16位还是32位,来自动选用被除数(AX、DX:
AX,还是EDX:
EAX);
功能:
用显式的操作数去除隐含操作数,可得到商和余数。
当商超过数据范围或除数为0,系统自动产生0中断。
1·DIV:
无符号数除法指令,用显式操作数去除隐含操作数(都作为无符号数)。
指令对标志位的影响无定义。
格式:
DIVReg/Mem
2·IDIV:
有符号数除法指令,用显式操作数去除隐含操作数(都作为有符号数)。
格式:
IDIVReg/Mem
数据类型转换指令
在有符号除法时,把短位数的被除数转换为位数更长的数据类型,以适应除法运算的要求。
1·CBW:
字节转换为字指令,用AL的符号位去填充AH,即:
当AL为正数,则AH=0,否则,AH=0FFH。
指令不影响任何标志位。
格式:
CBW
2·CWD:
字转换为双字指令,该指令的隐含操作数为AX、DX,用AX的符号位去填充DX。
指令不影响任何标志位。
格式:
CWD
逻辑运算指令
主要有:
逻辑与(AND)、逻辑或(OR)、逻辑非(NOT)、和异或指令(XOR)等
1·AND:
逻辑与指令,将源操作数的每位二进制与目的操作数中的相应二进制按位进行逻辑“与操作”,操作数存入目的操作数中。
格式:
ANDReg/Mem,Reg/Mem/Imm
受影响的标志位:
CF(0),OF(0),PF,SF,ZF(AF无定义)
2·OR:
逻辑或指令,把源操作数的每位二进制与目的操作数中的相应二进制按位进行逻辑“或操作”,操作数存入目的操作数中。
格式:
ORReg/Mem,Reg/Mem/Imm
受影响的标志位:
CF(0),OF(0),PF,SF,ZF(AF无定义)
3·NOT:
逻辑非指令,把源操作数的每位取反
格式:
NOTReg/Mem
指令不影响任何标志位。
4·XOR:
逻辑异或指令,把源操作数的每位二进制与目的操作数中的相应二进制按位进行逻辑“异或操作”,操作数存入目的操作数中。
格式:
XORReg/Mem,Reg/Mem/Imm
受影响的标志位:
CF(0),OF(0),PF,SF和ZF
5·TEST:
检测指令。
其实是一个不保留结果,只影响标志位的逻辑“与”指令。
格式:
TESTReg/Mem,Reg/Mem/Imm
受影响的标志位:
CF(0),OF(0),PF,SF,ZF
移位指令
包括:
算术移位、逻辑移位、循环移位、带进位移位和双精度移位。
1·SAL:
算术左移,向左逐位移动源操作数指定(CL/Imm)的次数,移位后,最低位用0补充,最高位移入CF。
格式:
SALReg/Mem,CL/Imm
2·SAR:
算术右移,向右逐位移动源操作数指定(CL/Imm)的次数,移动后,最高位用符号位补充,最低位移入CF。
格式:
SARReg/Mem,CL/Imm
3·SHL:
逻辑左移,在功能上和SAL完全相同
格式:
SHLReg/Mem,CL/Imm
4·SHR:
逻辑右移,向右逐位移动源操作数指定(CL/Imm)的次数,移动后,最高位用0补充,最低位移入CF。
5·ROL:
循环左移,对指定的寄存器或存储器操作数左移循环移动源操作数指定(CL/Imm)的次数,移动后,把最高位同时移入CF和操作数最低位。
格式:
ROLReg/Mem,CL/Imm
6·ROR:
循环右移,对指定的寄存器或存储器操作数右移循环移动源操作数指定(CL/Imm)的次数,移动后,把最低位同时移入CF和操作数最高位。
格式:
RORReg/Mem,Cl/Imm
7·RCL:
带进位的循环左移,对指定的寄存器或存储器操作数,连同进位标志CF左循环移动源操作数指定(CL/Imm)的次数,移动后,把操作数的最高位移入CF,而把CF原有内容移入源操作数的最高位。
格式:
RCLReg/Mem,CL/Imm
8·RCR:
带进位的循环右移,对指定的寄存器或存储器操作数,连同进位标志CF右循环移动源操作数(CL/Imm)的次数,移动后,把操作数的最高低位移入CF,而CF中原有内容移入操作数的最高位。
格式:
RCRReg/Mem,CL/Imm
循环指令
循环指令的循环次数都保存在计数器CX中,有的循环指令还可以由标志位ZF来决定是否结束循环;
1·循环指令
1·LOOP:
循环指令。
格式:
LOOP标号
2·LOOPZ/LOOPE:
相等或为零循环指令。
格式:
LOOPZ/LOOPE标号
3·LOOPNE/LOOPNZ:
不等或不为零循环指令
格式:
LOOPNE/LOOPNZ标号
标号是在程序中的某个标记,表示符合条件时程序跳到标记处继续执行。
2·循环计数器为零转指令
一般用于循环的开始,先判断CX是否为0,在进入循环体执行,可以与循环指令配合,构成“当”型循环。
格式:
JCXZ标号若cx为0,则执行标记处程序
转移指令
1·JMP:
无条件转移指令,是从程序当前执行的地方无条件转移到另一个地方执行。
这种转移可以是短转移【偏移量-128~127】、近转移【偏移量-32K~32K】、远转移【在不同代码之间转移】
格式:
JMP标号/Reg/Mem
2·JXX条件转移指令,它根据标志寄存器中一个(或多个)标志位来决定是否需要转移。
格式:
JXX标号/Reg/Mem
注意:
条件转移指令的操作数必须是一个短标号,也就是所有条件转移指令都必须是2字节指令。
条件转移指令对状态标记位没有影响。
条件转移指令有:
(单标志位)JE/JZ(等于、零),JNE/JNZ(不等于/不为零),JS(负---符号位位1),JNS(正---符号位位0),JP/JPE(偶),JNP/JPO(奇),JO(溢出),JNO(不溢出),JC(有进位/有进位),JNC(无进位/无借位)
(无符号数)JA/JNBE(高于、不低于也不等于),JAE/JNB(高于或等于不等于),JB/JNAE(低于、不高于也不等于),JBE/JNA(低于或等于、不高于)
(带符号数)JG/JNLE(大于、不小于也不等于),JGE/JNL(大于或等于/不下雨),JL/JNGE(小于、不大于也不等于),JLE/JNG(小于或等于、不大于)
字符串操作指令
指令的实质就是对一篇连续存储单元进行处理,存储单元的地址由隐含指针DS:
SI或ES:
DI来指定。
指令可对内存单元按字节、字或双字记性处理。
1·LODS:
取字符串数据指令,从由指针DS:
SI所指向的内存单元开始,取一个字节、字或双字进入AL、AX或EAX中,并根据标志位DF对寄存器SI作相应增减。
格式:
LODS地址表达式
该指令不影响任何标志位
2·STOS:
置字符串数据指令,把寄存器AL、AX或EAX中的值存于以指针ES:
DI所指向内存单元为起始的一篇内存单元里,并根据标志位DF对寄存器DI作相应增减。
格式:
STOS地址表达式
该指令不影响任何标志位。
3·MOVS:
字符串传送指针,把指针DS:
SI所指向的字节、字或双字传送给指针ES:
DI所指向内存单元,并根据标志位DF对寄存器DI和SI作相应的增减。
格式:
MOVS地址表达式1,地址表达式2
该指针不影响任何标志位。
4·CMPS:
把指针DS:
SI和ES:
EI所指向的自己、字或双字的值相减,并用所得到的差来设置有关的标志位,同时变址寄存器SI和DI也将根据标志位DF的值作相应增减。
格式:
CMPS地址表达式1,地址表达式2
受影响的标志位:
与CMP相同,会影响AF、CF、OF、PF、SF、ZF
5·SCAS:
字符串扫描指令,用指针ES:
DI所指向字节、字或双字的值与相应的AL、AX的值相减,用所得到的差来设置有关标志位,同时变址寄存器DI还将根据标志位DF的值进行增减。
格式:
SCAS地址表达式1
受影响的标志位:
AF、CF、OF、PF、SF、ZF
6·字符串操作重复前缀;之前的字符串操作指令都是针对单一的字符进行,为了对一个字符串重复使用操作指令,指令系统提供了一组重复前缀指令。
A·重复前缀REP:
重复其后的字符串操作指令,重复的次数由事先存放在CX中的值的变化来决定。
格式:
REPLODS/LODSB/LODSW
B·条件重复前缀:
和之前的REP功能类似,区别在与其重复次数不仅由CX决定,还会由标志位ZF来决定。
根据ZF所起的作用又分为:
相等重复前缀指令REPE/REPZ和不等重复前缀指令REPE/REPZ。
①相等前缀指令
格式:
REPE/REPZSCAS/SCASB/SCASW/SCASD
REPE/REPZCMPS/CMPSB/SMPSW/CMPSD
②不重复前缀指令
格式:
REPNE/REPNZSCAS/SCASB/SCASW/SCASD
REPNE/REPNZCMPS/CMPSB/CMPSW/CMPSD
ASCII和BCD码调整指令
为了方便十进制数进行算术运算,指令系统专门提供一组十进制数调整指令。
1·AAA:
加法的ASCII码调整指令
2·AAS:
减法的ASCII码调整指令
3·AAM:
乘法的ASCII码调整指令
4·AAD:
除法的ASCII码调整指令
5·DAA:
加法的十进制数调整指令
6·DAS:
减法的十进制数调整指令
处理器指令
1·标志位操作指令
是一组对标志位置位、复位、保存和恢复等操作的指令,指令都没有形式上的操作数。
A·进位标志CF操作数指令
清进位指令:
CLC;CF<--0
置进位指令:
STC;CF<--1
进位取反指令:
CMC;CF<---notCF
B·方向控制位DF操作指令
清方向指令:
CLD;DF<-----0
置方向指令:
STD;DF<-----1
C·中断允许控制位IF操作指令
清中断允许位指令:
CLI;IF<-----0
该指令的功能是不允许可屏蔽的的外部中断来中断其后程序的执行。
置中断允许位指令:
STI;IF<------1
该指令的功能是恢复可屏蔽的外部中断相应功能。
2·NOP:
空操作指令,主要起到延迟下一条指令的运行。
延迟指令运行也可以用其他指令产生延时,如:
“XCHGAX,AX”
格式:
NOP
不影响任何标志位
3·WAIT:
等待指令,使CPU处于等待状态,等待协处理器的运算,CPU不断检测TEST引脚状态,知道协处理器完成运算,TEST引脚变为低为止。
格式:
WAIT
指令不影响任何标志位
4·HLT:
暂停指令,使CPU处于暂停工作状态,等到外中断的到来,此时CS:
IP只想下一条要执行的指令。
发生中断时,CPU把CS和IP压栈,并转入中断处理程序,在中断处理程序执行完后,中断返回弹出IP和CS,CPU自动退出暂停状态,执行HLT后面的指令。
5·LOCK:
封锁数据指令,这是一个前缀指令,其后跟一个具体的操作指令。
LCOK指令可以保证在其后执行过程中,禁止协处理器修改数据总线上的数据,起到独占总线的作用。
多任务时,可以用它来保证独占内存。
只有一下指令可以使用LOCK前缀:
XCHG、ADD、INC、SUB、SBB、DEC、NEC、OR、AND、XOR、NOT、BT、BTS、BTR、BTC。
指令不影响任何标志位。
80286及以上型号CPU扩充的指令
80286及以上型号的CPU所能够执行的指令,在8086指令系统的基础上有了很大的扩充。
主要表现在三个方面:
数据类型的扩充;原有功能的扩充;完全新的指令
1·传送并扩展指令
把位数短的源操作数,传送给位数长的目的操作数,并且扩展填充满目的操作数。
A·MOVSX:
传送并扩展符号位指令,把源操作数的内容送到目的操作数,并且用符号位扩展填充满目的操作数。
格式:
MOVSXReg/Mem,Reg/Mem/Imm
B·MOVZX:
传送并扩展零指令,把源操作数的内容送到目的操作数,并用零填充目的操作数空出的高位。
格式:
MOVZXReg/Mem,Reg/Mem/Imm
2·堆栈指令
在80286及以上的系统中可以对双字类型的数据进行操作,并增加了一些实用的指令。
A·PUSH:
进栈指令,可以单字进栈,也可以双字进栈,还可以是立即数进栈。
根据进栈操作数的位数修改堆栈指针ESP。
格式:
PUSHImm
B·PUSHA:
16位通用寄存器进栈指令,依次把寄存器AX、CX、BX、SP、BP、SI、DI等压栈。
格式:
PUSHA
C·PUSHAD:
32位通用寄存器进栈指令,把寄存器EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI等压栈。
格式:
PUSHAD
D·POP:
出栈指令,根据操作数,弹出一个字或双字,对双字出栈。
格式:
POPReg/Mem
E·POPA:
16位通用寄存器出栈指令,一次吧寄存器DI、SI、BP、SP、DX、CX、AX等弹出栈。
与PUSHA对称。
格式:
POPA
F·POPAD:
32位通用寄存器出栈指令,依次把寄存器EDI、ESI、EBP、ESP、EBX、EDX、ECX、EAX等弹出栈,与PUSHAD对称。
格式:
POPAD
3·数据类型转换指令(符号扩展指令)
A·CWDE:
字转换为双字指令,指令隐含操作数AX,其功能是用AX的符号位填充EAX的高字位。
格式:
CWDE
该指令不影响标志位
B·CDQ:
双字转换为4字指令,隐含操作数EAX和EDX,用EAX的符号位填充EDX。
格式:
CDQ
指令不影响标志位
4·移位指令
此组指令有:
双精度左移SHLD和双精度右移SHRD,都具有三个操作数。
SHLD/SHRDReg/Mem,Reg,CL/Imm
执行SHLD指令时,第一个操作数向左移n位,其“空出”的低位由第二个操作数的高n位来填补,但第二个操作数自己不移动、不改变。
执行SHRD指令时,第一个操作数向右移n位,其“空出”的高位由第二个操作数的低n位来填补,但第二个操作数自己不移动、不改变。
受影响的标志位:
CF、OF、PF、SF、ZF
5·位操作指令
A·位扫描指令
格式:
BSF/BSRReg,Reg/Mem
指令在第二个操作数中寻找第一个“1”的位置。
如果找到,则该“1”的位置保存在第一个操作数中,并置标志位ZF为1,否则,置标志位ZF为0。
受影响的标志位:
ZF
B·位检测指令
格式:
BT/BTC/BTR/BTSReg/Mem,Reg/Mem
指令把第一个操作数中某一位的值传送给标志位CF,具体的哪一位由指令的第二个操作数来确定。
受影响的标志位:
CF
6·CMPXCHG:
比较交换指令,比较运算指令是先进行比较,再根据比较的结果决定是进行操作数的交换操作。
当两个操作数相等时,置标志位ZF为1;否则,把第一个操作数的值赋给第二个操作数,并置标志位ZF为0。
A·8位/16位/32位交换指令
格式:
CMPXCHGReg/Mem,AL/AX/EAX
受影响的标志位:
AF、CF、OF、PF、SF、ZF
B·64位比较交换指令
该指令只有一个操作数,第二个操作数是隐含的EDX
格式:
CMPXCHG*BReg/Mem,
只影响ZF标志位。
7·SET:
条件字节设置指令,条件字节设置指令时80386及其以后CPU所具有的一组指令。
在测试条件方面条件转移是一致的,但在功能方面,他们不是转移,而是根据测试条件的值来设置其字节操作数的内容位1或0。
格式:
SETxxReg/Mem