汇编语言:8086/8088常用指令集"/>
【沧海拾昧】汇编语言:8086/8088常用指令集
#C0301
沧海茫茫千钟粟,且拾吾昧一微尘
——《沧海拾昧集》@CuPhoenix
【阅前敬告】
沧海拾昧集仅做个人学习笔记之用,所述内容不专业不严谨不成体系
如有问题定为本集记录有谬,切勿深究
目录
一、数据传送类
1、通用数据传送指令【MOV】
2、堆栈指令【PUSH/POP】
3、交换指令【XCHG】
4、输入输出指令【IN/OUT】(累加器专用指令)
5、换码指令(查表指令)【XLAT】(累加器专用指令)
6、地址传送指令【LEA/LDS/LES】
7、标志寄存器传送指令【LAHF/SAHF】
二、算术运算类
1、无进位/带进位/增量加法指令【ADD/ADC/INC】
2、无借位/带借位/减量减法指令【SUB/SBB/DEC】
3、求补指令【NEG】
4、比较指令【CMP】
5、无符号/有符号乘法指令【MUL/IMUL】
6、无符号/有符号除法指令【DIV/IDIV】
7、扩展指令【CBW/CWD】
8、非压缩/压缩BCD码加法十进制调整指令【AAA/DAA】
9、非压缩/压缩BCD码减法十进制调整指令【AAS/DAS】
10、非压缩BCD码乘法十进制调整指令【AAM】
11、非压缩BCD码除法十进制调整指令【AAD】
三、逻辑运算与移位指令
1、取反指令【NOT】
2、与/或/异或指令【AND/OR/XOR】
3、测试指令【TEST】
4、算数左移/逻辑左移【SAL/SHL】
5、算数右移【SAR】
6、逻辑右移【SHR】
7、循环移位指令【ROL/ROR/RCL/RCR】
四、转移和控制类指令
1、无条件转移指令【JMP】
2、条件转移指令【J../JN..】
3、循环控制指令【LOOP..】
4、子程序调用和返回指令【CALL/RET】
5、中断指令【INT/INTO/IRET】
6、标志处理指令【PSW.SET/.CLEAR/.COMPLEMENT】
7、处理器暂停指令【HLT】
8、空操作指令【NOP】
一、数据传送类
1、通用数据传送指令【MOV】
格式:MOV OPRD1,OPRD2
功能:OPRD2 → OPRD1
允许: ①CPU内部寄存器(除IP、FLAG) → CPU内部寄存器(除CS、IP、FLAG);
②立即数 → CPU内部的通用寄存器组(8个,数据/变址/指针寄存器);
③CPU内部的寄存器(除CS、IP) ↔ 存储器(所有寻址方式);
④立即数 → 存储单元;
禁止: ① mov cs,ax ; CS,IP不能作为目的操作数
② mov ss,ds ; 段寄存器之间不能直接传送
③ mov ds,2000h ; 立即数不能直接传送给段寄存器
④ mov [si],[2000h] ; 内存单元间不能直接传送
⑤ mov 1000h,ax ; 立即数不能作为目的操作数
2、堆栈指令【PUSH/POP】
格式:PUSH OPRD / POP OPRD
功能:OPRD入栈 / 栈顶内容送OPRD
定义堆栈:设 ss=2000h(物理地址20000h),堆栈长度100字,则 sp=0064h(指向栈顶)
入栈操作:先移动sp指针,再压入数据(sp=sp-1,压高字节,sp=sp-1,压低字节)
出栈操作:先弹出数据,再移动sp指针(弹低字节,sp=sp+1,弹高字节,sp=sp+1)
允许: ①仅能对16位数操作,一次压入弹出一个字;
②必须对寄存器的内容或内存单元的内容进行操作;
示例: ① push ah ; 错误,ah是8位数
② push 2000h ; 错误,不能对立即数操作
③ push [2000h] ; 正确
3、交换指令【XCHG】
格式:XCHG OPRD1,OPRD2
功能:OPRD1与OPRD2内容互换
允许: ①通用寄存器 ↔ 通用寄存器;
②通用寄存器 ↔ 存储器;
禁止: ① 内存单元之间不能直接交换;
② 段寄存器、IP、立即数不能成为操作数;
4、输入输出指令【IN/OUT】(累加器专用指令)
格式:IN AL,PORT / IN AX,PORT / OUT PORT,AL / OUT PORT,AX
功能:从PORT口输入数据到AL(AX) / 将AL(AX)中的内容从PORT口输出
允许: ①只能对AL/AX操作,若传送数据为16位,端口地址只能取偶地址;
②端口地址大于8位(0FFH),使用DX间接寻址;
5、换码指令(查表指令)【XLAT】(累加器专用指令)
格式:XLAT
功能:(提前对BX,AL赋值)将BX+AL作为偏移地址,取值送入AL中
用途:将累加器AL中的内容变换为存储器表格中的某一个值,常用来实现编码码制的转换
6、地址传送指令【LEA/LDS/LES】
格式:LEA OPRD1,OPRD2
功能:将源操作数的偏移地址送到目的操作数中
允许: ①源操作数必须为存储器操作数;
②目的操作数必须为一个16位的通用寄存器;
用途:通常用来使一个寄存器作为地址指针
注:LEA指令与OFFSET伪指令有一定相似之处,可参见《offset与lea区别_百度知道》
格式:LDS/LES OPRD1,OPRD2
功能:将指定内存中的4个字节(32位)分别装入指定的寄存器和段寄存器DS/ES中
允许: ①源操作数必须是寄存器,如DI;
②目的操作数必须是一个地址;
示例: DS:[2130h]=00h,DS:[2131h]=04h,DS:[2132h]=00h,DS:[2133h]=10h
[10400H]=0ffh,[10401H]=00h,[10402H]=0aah,[10403H]=00h
执行 lds di,[2130h] ,结果为di=7940h,ds=3024h
再执行 les ax,[di] ,结果为ax=00ffh,es=00aah
7、标志寄存器传送指令【LAHF/SAHF】
格式:LAHF / SAHF
功能:将FLAG的低八位装入AH / 将AH的值设为FLAG低八位的值
FLAG | SF | ZF | × | AF | × | PF | × | CF |
---|---|---|---|---|---|---|---|---|
AH | D7 | D6 | × | D4 | × | D2 | × | D0 |
二、算术运算类
1、无进位/带进位/增量加法指令【ADD/ADC/INC】
格式:ADD OPRD1, OPRD2
功能:(OPRD1) + (OPRD2) → OPRD1
标志位:影响标志位
格式:ADC OPRD1, OPRD2
功能:(OPRD1) + (OPRD2) + CF → OPRD1
标志位:影响标志位
格式:INC OPRD
功能:(OPRD) + 1 → OPRD
标志位:不影响CF,影响AF,OF,PF,SF和ZF
示例: ① inc [2000h] ; 错误,未指明操作数的类型
② inc byte ptr [bx] ; 正确,指明了是将[bx]起的字节型进行增量
2、无借位/带借位/减量减法指令【SUB/SBB/DEC】
格式:SUB OPRD1, OPRD2
功能:(OPRD1) - (OPRD2) → OPRD1
标志位:影响标志位
格式:SBB OPRD1, OPRD2
功能:(OPRD1) - (OPRD2) - CF → OPRD1
标志位:影响标志位
格式:DEC OPRD
功能:(OPRD) - 1 → OPRD
标志位:不影响CF,影响AF,OF,PF,SF和ZF
3、求补指令【NEG】
格式:NEG OPRD
功能:0 – (OPRD) → OPRD
标志位:影响标志位。只有当操作数为0时, CF为0, 否则CF总为1。若操作数为80H或8000H,执行求补指令后,结果没有变化,但OF置1。
4、比较指令【CMP】
格式:CMP OPRD1, OPRD2
功能:(OPRD1) - (OPRD2)
标志位:不保存结果,只影响标志位
用法: ①考察ZF标志位的情况判断是否相等,若两者相等,ZF标志为1,否则为0;
②对无符号数:
若结果没有产生借位(CF=0),则AX≥BX;若产生了借位(CF=1),则AX<BX;
③对带符号数:
考察OF与SF异或运算的结果,结果为1,则AX<BX,结果为0,则AX≥BX;
5、无符号/有符号乘法指令【MUL/IMUL】
格式:MUL OPRD / IMUL OPRD
功能:AL/AX×OPRD → AX / DX, AX
规则:乘法的固定存储器有如下约定
①(8位×8位→16位):AL × 寄存器或存储器 → AX;
②(16位×16位→32位):AX × 寄存器或存储器 → DX,AX(高位在DX,低位在AX);
示例: ① MUL BL ; AL与BL相乘,结果存在AX中
② MUL CX ; AX与CX相乘,结果存在DX和AX中
③ MUL BYTE PTR [DI] ; AL与存储器相乘,结果存在AX中
④ MUL WORD PTR [SI] ; AX与存储器相乘,结果存在DX和AX中
⑤ IMUL BL / IMUL CX / IMUL BYTE PTR [DI] ; 有符号数相乘
标志位:影响CF和OF标志位,AF、 PF、 SF、 ZF标志位无意义
①对MUL指令,当乘积的高半部分不为0,CF=OF=1,表示高半部分包含有结果的有效数。否则CF=OF=0。
②对IMUL指令,当乘积的高半部分是低半部分最高位的扩展,即乘积的高半部分每位与低半部分最高位相同时(符号扩展),CF=OF=0,不溢出;否则,CF=OF=1,溢出。(注:有符号数乘法的高半部分只起到符号作用,溢出时,高半部分是无效信息,不予关注,可参阅【汇编语言】乘法(MUL/IMUL)_曝雨的博客-CSDN博客_汇编乘法)
6、无符号/有符号除法指令【DIV/IDIV】
格式:DIV OPRD / IDIV OPRD
功能:DX,AX/AX ÷ OPRD → AX/AL,DX/AH
规则:除法的固定存储器有如下约定
①(16位÷8位→8位):AX ÷ 寄存器或存储器 → 8位商在AL,8位余数在AH;
②(32位÷16位→16位):DX,AX ÷ 寄存器或存储器 → 16位商在AX,16位余数在DX;
示例: ① DIV BL ; AX除以BL,8位商在AL,8位余数在AH
② DIV CX ; DX,AX除以CX,16位商在AX,16位余数在DX
③ DIV BYTE PTR [DI] ; AX除以存储器,8位商在AL,8位余数在AH
④ IDIV BL ; 有符号数相除
标志位:所有标志位无意义
注: ①用IDIV指令时,如果是双字除以一个字,则商的范围为-32768~32767,如果是一个字除以一个字节,则商的范围为-128~127。如果超出这个范围,会作为除数为0来处理,产生0号中断。
②8086系统规定余数的符号和被除数相同。
③当8位数除以8位数,16位数除以16位数时,必须对被除数进行扩展。
7、扩展指令【CBW/CWD】
格式:CBW
功能:将AL中的符号位扩展到AH中(字节扩展成字)
规则:当AL<80H,执行CBW后,AH=0;当AL>=80H时,AH=0FFH。
格式:CWD
功能:将AX中的符号位扩展到DX中(字扩展成双字)
规则:当AX<8000H,执行CWD后, DX=0; 当AX>=8000H时,DX=0FFFFH。
8、非压缩/压缩BCD码加法十进制调整指令【AAA/DAA】
调整指令使用时,必须紧跟在相对应的加法指令后进行。
格式:AAA
功能:两个非压缩的BCD码相加,结果在AL中,执行指令后将结果调整为十进制,放在AX中
规则:若调整前满足①AL低半部包含的数值大于9,②AF=1,中的一项,即进行调整(AL加6,AF和CF置1,AL的高4位清零),因此需要注意执行指令前的AF标志位,以免出现错误。
格式:DAA
功能:两个压缩的BCD码相加,结果在AL中,执行该指令后将结果调整为十进制,放在AL中
规则:当AL<80H,执行CBW后,AH=0;当AL>=80H时,AH=0FFH。
注:若调整前满足①AF=1或AL的低4位大于9,②CF=1或AL的高4位大于9,中的一项,即进行调整,因此需要注意执行指令前的AF、CF标志位,以免出现错误。(满足①,则AL加06H并置AF=1;满足②,则AL加60H并置CF=1;若同时满足,则AL加66H, 并置AF=1,CF=1)
9、非压缩/压缩BCD码减法十进制调整指令【AAS/DAS】
调整指令使用时,必须紧跟在相对应的减法指令后进行。
格式:AAS
功能:两个非压缩的BCD码相减,结果在AL中,执行指令后将结果调整为十进制,放在AX中
格式:DAS
功能:两个压缩的BCD码相减,结果在AL中,执行该指令后将结果调整为十进制,放在AL中
注:减法调整指令与加法调整指令类似,只是分别将加06H,60H,66H改为减06H,60H,66H。
10、非压缩BCD码乘法十进制调整指令【AAM】
调整指令使用时,必须紧跟在相对应的乘法指令后进行。
格式:AAM
示例: MOV AL, 05H
MOV BH, 06H
MUL BH ; AX:001EH
AAM ; AX:0300H
11、非压缩BCD码除法十进制调整指令【AAD】
调整指令使用时,必须紧跟在相对应的除法指令后进行。
格式:AAD
示例: MOV AX, 0300H
MOV BL, 05H
AAD ; AX:001EH
DIV BL ; AX:0006H
三、逻辑运算与移位指令
1、取反指令【NOT】
格式:NOT OPRD
功能:OPRD按位取反
标志位:对标志位没有影响
2、与/或/异或指令【AND/OR/XOR】
格式:AND OPRD1,OPRD2 / OR OPRD1,OPRD2 / XOR OPRD1,OPRD2
功能:OPRD1和OPRD2按位去与/或/异或
标志位:CF=0, OF=0, SF,PF,ZF发生变化
用途:对某些位置1用OR, 对某些位清零用AND, 对某些位取反用XOR
3、测试指令【TEST】
格式:TEST OPRD1, OPRD2
功能:(OPRD1) AND (OPRD2)
标志位:结果影响标志位ZF,PF,SF
4、算数左移/逻辑左移【SAL/SHL】
格式:SAL OPRD, M / SHL OPRD, M
功能:OPRD算术左移M位 / OPRD逻辑左移M位
操作:左移一位进CF,右边补0
标志位:影响标志位,若移位后最高位与CF不同,则OF=1,表示移位前后数据变号
示例:设 AL = 0000 0010 B , CL = 04H
① SAL AL,1 ; 正确,AL = 0000 0100 B
② SAL AL,4 ; 错误,移位大于1,需将移位数赋到CL中,将CL作为操作数
③ SHL AL,CL ; 正确,AL = 0010 0000 B
5、算数右移【SAR】
格式:SAR OPRD, M
功能:OPRD算术右移M位
操作:最低位移进CF, 左边重复最高位, 即操作数符号不变。
用途:一般用于有符号数的右移,符号扩展
示例:设 AL = 1111 1100 B ( -4 )
① SAR AL,1 ; 正确,AL = 1111 1110 B ( -2 )
② SAR AL,4 ; 错误,移位大于1,需将移位数赋到CL中,将CL作为操作数
6、逻辑右移【SHR】
格式:SHR OPRD, M
功能:OPRD逻辑右移M位
操作:最低位移进CF, 左边补0。
用途:一般用于无符号数的右移。
示例:设 AL = 0000 1000 B ( 8 )
① SHR AL,1 ; 正确,AL = 0000 0100 B ( 4 )
② SHR AL,4 ; 错误,移位大于1,需将移位数赋到CL中,将CL作为操作数
7、循环移位指令【ROL/ROR/RCL/RCR】
指令 | 操作 | 说明 |
---|---|---|
ROL | 若移位后最高位与CF不同,则OF=1,表示移位前后数据变号。 | |
ROR | - | |
RCL | - | |
RCR | - |
四、转移和控制类指令
1、无条件转移指令【JMP】
格式:JMP [PTR] OPRD
功能:程序转向由OPRD指向的位置执行
说明: ① 对于直接转移,OPRD通常以标号形式出现;
②对于直接转移,[PTR]有short/near ptr/far ptr(短程/近程/远程)三种值可取,短程与近程属段内转移,远程属段间转移。其默认值为NEAR,可以省略。(近程、短程时,CS不变,IP=IP+位移量;远程时,新的CS和IP由OPRD指向位置的段地址和段内地址决定。)
③对于间接转移,操作数一般是一个存储器操作数,真正的转移地址在内存中。(操作数是寄存器时例外)
示例: ① jmp again ; 正确,直接转移到标号again
②对于间接转移:
类型 | 指令示例 | 操作 |
---|---|---|
段内间接转移 | jmp word ptr [si] | ds:[si+1][si] → ip |
段间间接转移 | jmp dword ptr [si] | ds:[si+3][si+2] → cs ds:[si+1][si] → ip |
2、条件转移指令【J../JN..】
类型 | 指令 |
---|---|
判断标志位 | JZ/JNZ,JC/JNC,JS/JNS,JP/JNP,JO/JNO |
判断无符号数大小 | JA/JNBE,JAE/JNB,JB/JNAE,JBE/JNA |
判断有符号数大小 | JG/JNLE,JGE/JNL,JL/JNGE,JLE/JNG |
判断其他 | JCXZ rel(如CX中的值为0则转移,判断循环用) |
注:上表中英文简写如下对照,可便于理解。
简写 | 英文 |
---|---|
A | Above |
B | Below |
E | Equle |
G | Greater |
L | Less |
N | Not |
注:JZ与JE是完全等价的。JE既可用于有符号数也可用于无符号数。
(更多详细对照可参考《汇编语言指令集学习条件转移指令详解 - 百度文库》)
3、循环控制指令【LOOP..】
格式 | 循环条件 | 说明 |
---|---|---|
LOOP 标号 | cx ≠ 0 | CX为0并不影响标志位ZF,ZF是否为1是由循环指令前面的指令决定的。 |
LOOPZ/LOOPE 标号 | cx ≠ 0 , zf = 1 | |
LOOPNZ/LOOPNE 标号 | cx ≠ 0 , zf = 0 |
注:每轮循环结束时,cx=cx-1,因此循环中如果对cx有操作,应选择条件转移指令进行循环控制。
4、子程序调用和返回指令【CALL/RET】
格式:CALL NEAR PTR OPRD / CALL FAR PTR OPRD
功能:调用子程序
注:[PTR]默认为near ptr,段内调用可省略
格式:RET
功能:返回主程序
注:可以写为 RET n,即从栈顶弹出返回地址后,sp=sp+n(n为偶数,即栈顶位置跳过n个字节)。
5、中断指令【INT/INTO/IRET】
格式:INT N
功能:响应N号中断
格式:INTO
功能:对溢出情况进行中断响应
格式:IRET
功能:从中断服务子程序返回主程序
6、标志处理指令【PSW.SET/.CLEAR/.COMPLEMENT】
指令 | 功能 |
---|---|
CLC | CF=0 |
STC | CF=1 |
CMC | CF取反 |
CLD | DF=0,地址增量 |
STD | DF=1,地址减量 |
CLI | IF=0,中断屏蔽 |
STI | IF=1,中断允许 |
7、处理器暂停指令【HLT】
格式:HLT
功能:用软件的方法使CPU处于暂停状态,等待硬件中断,响应硬件中断时,使CPU退出暂停状态,执行中断服务子程序,中断返回后,CPU接着执行HLT的后续指令。
8、空操作指令【NOP】
格式:HLT
功能:执行该指令占一个指令周期,不影响任何操作,常用于精确定时。
敬谢诸君。
于金陵钟山之阳。
更多推荐
【沧海拾昧】汇编语言:8086/8088常用指令集
发布评论