【沧海拾昧】汇编语言: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低八位的值

FLAGSFZF × AF × PF × CF
AHD7D6 × 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则转移,判断循环用)

        注:上表中英文简写如下对照,可便于理解。

简写英文
AAbove
BBelow
EEqule
GGreater
LLess
NNot

        注:JZ与JE是完全等价的。JE既可用于有符号数也可用于无符号数。

        (更多详细对照可参考《汇编语言指令集学习条件转移指令详解 - 百度文库》)

3、循环控制指令【LOOP..】

格式循环条件说明
LOOP 标号cx ≠ 0CX为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】

指令功能
CLCCF=0
STCCF=1
CMCCF取反
CLDDF=0,地址增量
STDDF=1,地址减量
CLIIF=0,中断屏蔽
STIIF=1,中断允许

7、处理器暂停指令【HLT】

        格式:HLT

        功能:用软件的方法使CPU处于暂停状态,等待硬件中断,响应硬件中断时,使CPU退出暂停状态,执行中断服务子程序,中断返回后,CPU接着执行HLT的后续指令。

8、空操作指令【NOP】

        格式:HLT

        功能:执行该指令占一个指令周期,不影响任何操作,常用于精确定时。


敬谢诸君。


于金陵钟山之阳。

  • 49
    点赞
  • 158
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值