8086汇编基本指令
Contents
一、数据传送 1、MOV
描述:赋值指令 格式:MOV DST,SRC 功能: DST <= SRC 注意:①不能DST,SRC都是存储器,这也是所有双操作数指令的通用要求。 ② 但其中一个是段寄存器时,另一个操作数必须是数据寄存器。
③不允许往CS传递数据
④将立即数送存储时,要指定操作数类型。BYTE PTR ,WORD PTR, DWORD PTR
⑤不影响PSW
2、PUSH
描述:入栈指令 格式:PUSH SRC 功能:将SRC入栈 注意:①只能是对“字”操作。 3、POP
描述:出栈指令 格式:POP DST 功能:将栈顶元素出栈赋值给DST 4、XCHG
描述:数据交换指令 格式:SCHG DST,SRC 功能:将DST.SRC的值进行交换 注意:①不能DST,SRC都是存储器,这也是所有双操作数指令的通用要求。 5、IN
格式:IN DST,SRC 功能:从SRC端口读取一个字节/字到DST中。 6、OUT
格式:OUT DST,SRC 功能:将SRC中的数据送到DST短空中 7、XLAT
描述:取表指令 格式:XLAT 功能:以DS:[BX+AL]为地址提取一个字节的数据送到AL中 8、LEA
格式:LEA REG,MEM 功能:取MEM的偏移地址送到REG中。 9、LDS
格式:LDS reg,mem 功能:是把mem指向的地址,高位存放在DS中,低位存放在reg中。 10、LES
格式:LES reg,mem 功能:是把mem指向的地址,高位存放在ES中,低位存放在reg中。 11、PUSHF
格式:PUSHF 功能:将PSW进栈 12、POPF
格式:POPF 功能:将栈顶元素送到PSW 13、LAHF
格式:LAHF 功能:将PSW的低八位送到AH中 14、SAHF
格式:SAHF 功能:将AH写入PSW的低八位 二、算术 1、ADD
描述:加法指令 格式:ADD DST,SRC 功能: DST <= DST+REC 2、ADC
格式:ADC DST,SRC 功能:DST <= DST + REC + CF 3、INC
格式: INC DST 功能:DST <= DST + 1 4、SUB
格式:SUB DSTSRC 功能: DST <= DST - SRC 5、SBB
格式:SBB DST,SRC 功能:DST <= DST - SRC - CF 6、DEC
格式: DEC DST 功能:DST <= DST - 1 7、NEG
格式:NEG REG 功能:求补,即REG中的各位取反,然后 + 1。 8、CMP
格式:CMP DST,SRC 功能:DST - REG 结果不保存,但是状态保存在PSW中。 9、MUL
描述:无符号数乘法 格式:MUL SRC 功能:①字节操作:(AX) <=(AL) * (SRC) ②字操作: (DX,AX) <= (AX) *(SRC)
③双字操作:(EDX,EAX) <= (EAX) *(SRC)
10、IMUL
描述:有符号数乘法 格式:IMUL SRC 功能:DST <= DST * SRC 11、DIV
描述:无符号数除法 格式:DIV SRC 功能:①字节操作:(AH) <= (AX)/(SRC)的余数;(AL) <= (AX)/(SRC)的商 ②字操作:(DX) <= (DX,AX)/(SRC)的余数;(AX) <= (DX,AX)/(SRC)的商
③双字操作:(EDX) <= (EDX,EAX)/(SRC)的余数;(EAX) <= (EDX,EAX)/(SRC)的商
12、IDIV
描述:有符号数除法 格式:IDIV SRC 功能:①字节操作:(AH) <= (AX)/(SRC)的余数;(AL) <= (AX)/(SRC)的商 ②字操作:(DX) <= (DX,AX)/(SRC)的余数;(AX) <= (DX,AX)/(SRC)的商
③双字操作:(EDX) <= (EDX,EAX)/(SRC)的余数;(EAX) <= (EDX,EAX)/(SRC)的商
13、CBW
格式:CBW 功能:将AL保持原值(有符号数)扩展到AX。 注意:此时是将AL的值看为有符号数,根据AL的最高位(符号位)来决定AH是00H还是FFH 14、CWD
格式:CWD 功能:将AX保持原值(有符号数)扩展到DX,AX。 注意:此时是将AX的值看为有符号数,根据AX的最高位(符号位)来决定DX是0000H还是FFFFH
三、逻辑
1、AND
描述:“与”逻辑运算 格式: AND DST,SRC 功能: DST <= DST AND SRC 将DST和REG对应各位进行“与”运算后结果保留于DST 2、OR
描述:“或”逻辑运算 格式: OR DST,SRC 功能: DST <= DST OR SRC 将DST和REG对应各位进行“或”运算后结果保留于DST 3、NOT
描述:“非”逻辑运算 格式: NOT DST 功能: DST <= NOT DST 将DST各位"取反"结果保留于DST 4、XOR
描述:“异或”逻辑运算 格式: XOR DST,SRC 功能: DST <= DST XOR SRC 将DST和SRC对应各位进行“异或”运算后结果保留于DST 5、TEST
描述:“与”逻辑运算,当只影响PSW,不保留运算结果。 格式: TEST DST,SRC 功能: DST AND SRC 将DST和SRC对应各位进行“与”运算,结果状态影响PSW,但不该表DST,SRC的值。 6、SHL
描述:逻辑左移 格式:SHL DST,1/CL 功能:将DST顺序左移1位或CL寄存器中指定的位数。左移一位时,DST的最高位移入进位标志位CF,最低位补零。 7、SAL
描述:算术左移 格式:SAL SRC,1/CL 功能:将SRC顺序左移1位或CL寄存器中指定的位数。左移一位时,SRC的最高位移入进位标志位CF,最低位补零。 8、SHR
描述:逻辑右移 格式:SHR SRC,1/CL 功能:将SRC顺序右移1位或CL寄存器指定的位数。逻辑右移1位时,SRC的最低位移到进位标志位CF,最高位补零。 9、SAR
描述:算术右移 格式:SAR SRC,1/CL 功能:将SRC顺序右移1位或CL寄存器指定的位数。逻辑右移1位时,SRC的最低位移到进位标志位CF,最高位用原先最高位的值填充。 10、ROL
描述:循环左移 格式:ROL SRC,1/CL 功能:将SRC顺序左移1位或CL寄存器指定的位数。循环左移1位时,SRC的最高位移到最低位,并且最高位同时移入标志位CF。 11、ROR
描述:循环右移 格式:ROR SRC,1/CL 功能:将SRC顺序右移1位或CL寄存器指定的位数。循环左移1位时,SRC的最低位移到最高位,并且最低位同时移入标志位CF。 12、RCL
描述:带进位循环左移 格式:RCL SRC,1/CL 功能:将SRC顺序左移1位或CL寄存器指定的位数。带进位循环左移1位时,原先状态位CF的值移入SRC的最低位,SRC的最高位移入状态位CF。 13、RCR
描述:带进位循环右移 格式:RCR SRC,1/CL 功能:将SRC顺序右移1位或CL寄存器指定的位数。带进位循环右移1位时,原先状态位CF的值移入SRC的最高位,SRC的最低位移入状态位CF。 四、串指令 当方向标志位DF = 0时,DI,SI+;当DF = 1时,DI,SI-。
ES:DI DS:SI
1、MOVS
格式:①MOVS DST,SRC ②MOVSB(字节) ③MOVSW(字) ④MOVSD(双字) 功能: ①字节操作: [ES:DI]<=[DS:SI] ,SI<=SI +/- 1 ②字操作: [ES:DI]<=[DS:SI]] ,SI <= SI +/- 2
③双字操作: [ES:DI]<=[DS:SI] ,SI <= SI +/- 4
2、CMPS
格式:①CMPSB(字节) ②CMPSW(字) ③CMPSD(双字) 功能: ①字节操作: [DS:SI] - [ES:DI] ,SI<=SI +/- 1 ②字操作: [DS:SI] - [ES:DI] ,SI <= SI +/- 2
③双字操作: [DS:SI] - [ES:DI] ,SI <= SI +/- 4
3、LODS
格式:①LODSW(字) ③LODSD(双字) 功能: ①字节操作:AL <= [DS:SI] ,SI<=SI +/- 1 ②字操作: AX <= [DS:SI] ,SI <= SI +/- 2
③双字操作: EAX <= [DS:SI] ,SI <= SI +/- 4
4、STOS
格式:①STOSB(字节) ②STOSW(字) ③STOSD(双字) 功能: ①字节操作:[DS:SI] <= AL ,SI<=SI +/- 1 ②字操作: [DS:SI] <= AX ,SI <= SI +/- 2
③双字操作: [DS:SI] <= EAX ,SI <= SI +/- 4
5、SCAS
格式:①SCASB(字节) ②SCASW(字) ③SCASD(双字) 功能: ①字节操作: AL - [DS:SI] ,SI<=SI +/- 1 ②字操作: AX - [DS:SI] ,SI <= SI +/- 2
③双字操作: EAX - [DS:SI] ,SI <= SI +/- 4
6、REP
格式:REP string primitive(MOVS,LODS,STOS,INS和OUTS) 功能:①如果CX = 0退出,否则继续运行以下操作 ②CX <= CX - 1
③执行以后串操作
④重复 ①~③
7、REPE/REPZ
格式:REPE/REPZ string primitive(CMPS或SCAS) 功能:①如果CX = 0 或 ZF = 0 退出,否则继续运行以下操作 ②CX <= CX - 1
③执行以后串操作
④重复 ①~③
8、REPNE/REPNZ
格式:REPNE/REPNZ string primitive(CMPS或SCAS) 功能:①如果CX = 0 或 ZF = 1 退出,否则继续运行以下操作 ②CX <= CX - 1
③执行以后串操作
④重复 ①~③
五、无条件转移
1、JMP
格式:JMP ADDRESS 功能: 无条件跳转到 ADDRESS 六、条件转移 1、根据PSW 1、JZ
格式:JZ EX 功能:当ZF = 1时,跳转到EX 2、JNZ
格式:JNZ EX 功能:当ZF = 0时,跳转到EX 3、JC
格式:JC EX 功能:当CF = 1时,跳转到EX 4、JNC
格式:JNC EX 功能:当CF = 0时,跳转到EX 5、JO
格式:JO EX 功能:当OF = 1时,跳转到EX 6、JNO
格式:JNO EX 功能:当OF = 0时,跳转到EX 7、JS
格式:JS EX 功能:当SF = 1时,跳转到EX 8、JNS
格式:JNS EX 功能:当SF = 0时,跳转到EX 2、比较两个无符号数后
# N :不等于 A:大于 B : 小于 E :等于
3、比较两个有符号数后
# N :不等于 G:大于 L : 小于 E :等于
4、JCXZ
格式: JCXZ EX 功能:若 CX = 0,则跳转到EX 七、循环 LOOP LOOPE/LOOPZ LOOPNE/LOOPNZ 八、子程序 1、CALL
格式:①CALL EX/NEAR PTR EX ②CALL FAR PTR EX
功能:①将IP进栈;将子程序的入口地址的位移量 =>IP ②将CS入栈;将IP入栈;将子程序入口地址偏移量 =>IP;将子程序的段地址 =>CS
2、RET
格式:RET (num) 功能:①将栈顶元素出栈 => IP ②将SP向高地址移动num位。
3、RETF
格式:RETF (num) 功能:①将栈顶元素出栈 => IP ②将栈顶元素出栈 =>CS
③将SP向高地址移动num位。
九、中断 INT XX IRET 十、空操作 NOP 十一、标志 1、CLC
格式:CLC 功能:令CF=0 2、STC
格式:STC 功能:令CF=1 3、CMC
格式:CMC 功能:令CF取反。 4、CLD
格式:CLD 功能:令DF = 0 5、STD
格式:STD 功能:令DF = 1 6、CLI
格式:CLI 功能:禁止发生中断 7、STI
格式:STI 功能: 允许发生中断
Author 软件开发大郭
LastMod 2022-09-29