8086汇编语言基础学习(二)—— 汇编指令
8086汇编语言基础学习(二)—— 汇编指令
数据传输指令:
1. MOV 指令
- 描述:赋值指令
- 格式:MOV DST,SRT
- 功能:双操作数,将SRT 赋值给DST
- 注意:
- DST,SRT不能同时为mem,对于所有的双操作数皆是如此。
- 不允许对CS赋值
- 其中一个是段寄存器时,另一个就必须是数据寄存器
- 将立即数送入mem时,要指定操作数的类型,例 BYTE PTR,WORD PTR,DWORD PTR
- 不影响PSW
2. PUSH 指令
- 描述:进栈指令
- 格式:PUSH SRC
- 功能:单操作数,将SRC压入堆栈
- 注意:
- 只能对“字”进行操作
3. POP 指令
- 描述:出栈指令
- 格式:POP DST
- 功能:单操作数,将栈顶元素弹出给DST
4. XCHG 指令
- 描述:数据交换指令
- 格式:XCHG DST,SRT
- 功能:双操作数,交换DST,SRT的值
- 注意:
- DST,SRT 不能均为mem
5. IN 指令
- 描述:端口输入指令
- 格式:IN DST,SRT
- 功能:双操作数,从端口SRT中读出一个字或字节到DST中
6. OUT 指令
- 描述:端口输出指令
- 格式:OUT DST,SRT
- 功能:双操作数,向端口DST输出DST中的数据
7. XLAT 指令
- 描述:查表转换指令
- 格式:XLAT
- 功能:零操作数!将DS : [ BX+AL ] 为地址的一个字节的内容传给AL
8. LEA 指令
- 描述:传输偏移地址指令
- 格式:LEA REG,MEM
- 功能:双操作数,将MEM的偏移地址传给REG,这里的操作数类型是固定不变的!
9. LDS 指令
- 描述:传送偏移地址及首地址指令
- 格式:LDS REG,MEM
- 功能:双操作数,将MEM的偏移地址(低位)传给REG,并将MEM的段首地址(高位)传给DS
10. LES 指令
- 描述:和LDS指令功能相似
- 格式:LES REG,MEM
- 功能:双操作数,将MEM的偏移地址(低位)传给REG,并将MEM的段首地址(高位)传给ES
11. PUSHF 指令
- 描述:标志寄存器进栈
- 格式:PUSHF
- 功能:零操作数,将PSW程序状态字压入堆栈
12. POPF 指令
- 描述:标志寄存器出栈
- 格式:POPF
- 功能:零操作数,将栈顶元素弹出给FR
13. LAHF 指令
- 描述:标志送AH,Load AH,FR
- 格式:LAHF
- 功能:零操作数,将FR的低八位赋值给AH
14. SAH 指令
- 猫叔:AH送标志,SET FR,AH
- 格式:SAH
- 功能:零操作数,将AH赋值给FR的低八位
算术运算指令:
1. INC 指令
- 描述:自加1
- 格式:INC DST
- 功能:单操作数,DST = DST + 1
- 注意:影响ZF,PF,SF,OF,AF
2. ADD 指令
- 描述:不带进位的加法
- 格式:ADD DST,SRC
- 功能:双操作数,DST = DST + SRC
- 注意:影响ZF,PF,SF,CF,OF,AF
3. ADC 指令
- 描述:带进位的加法
- 格式:ADC DST,SRC
- 功能:双操作数,DST = DST + SRC + CF
- 注意:影响ZF,PF,SF,CF,OF,AF
4. DEC 指令
- 描述:自减1
- 格式:DEC DST
- 功能:单操作数,DST = DST - 1
- 注意:影响ZF,PF,SF,OF,AF
5. SUB 指令
- 描述 :不带借位的减法
- 格式:SUB DST,SRC
- 功能:双操作数,DST = DST - SRC
- 注意:影响ZF,PF,SF,CF,OF,AF
6. SBB 指令
- 描述:带借位的减法
- 格式:SBB DST,SRC
- 功能:双操作数,DST = DST - SRC - CF
- 注意:影响ZF,PF,SF,CF,OF,AF
7. NEG 指令
- 描述:求某个数的补码
- 格式:NEG DST
- 功能:单操作数,将DST求补,各位数取反然后加一,也可以理解为零减去DST(不带借位)
- 注意:影响ZF,PF,SF,CF,OF,AF
8. CMP 指令
- 描述:比较两个数的大小
- 格式:CMP DST,SRC
- 功能:双操作数,比较DST,SRC的大小,结果通过FR展示,实际上进行的是DST - SRC的操作,但是不保存结果
- 注意:影响ZF,PF,SF,CF,OF,AF
9. MUL 指令
- 描述:无符号数乘法
- 格式:MUL SRC
- 功能:单操作数
- 对字节操作:AX = ( AL ) * SRC
- 对字操作:( DX,AX ) = AX * SRC
- 对双字操作:( EDX,EAX ) = ( EDX ) * SRC
- 注意:
- 隐含了AX为一个默认的操作数
- 若乘积的高半部分不为零时,则将CF,OF置为 ‘1’,否则置为 ‘0’ 。无符号数的乘法AF,PF,SF,ZF没有定义,因为没有符号
10. IMUL 指令
- 描述:有符号数乘法
- 格式:IMUL SRC
- 功能:单操作数
- 对字节操作:AX = ( AL ) * SRC
- 对字操作:( DX,AX ) = AX * SRC
- 对双字操作:( EDX,EAX ) = ( EDX ) * SRC
- 注意:
- 隐含了AX为一个默认的操作数
- 若乘积的高半部分不为零时,则将CF,OF置为 ‘1’,否则置为 ‘0’ 。无符号数的乘法AF,PF,SF,ZF没有定义,因为没有符号
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作为操作数
- 因为扩展的默认位有符号数,这里是将符号位向高半部扩展
14. CWD 指令
- 描述:字扩展位双字,有符号扩展
- 格式:CWD
- 功能:零操作数,将AX的保持原值(有符号数)扩展到 ( DX,AX )
- 注意:
- 这里隐含的是将AX作为操作数
- 因为扩展默认位有符号数,这里是将符号位向高半部扩展
逻辑运算指令:
1.AND 指令
- 描述:按位“与”逻辑运算
- 格式: AND DST,SRC
- 功能:双操作数,DST = DST and SRC
- 注意:OF = 0,CF = 0,AF不定,SF,ZF,PF根据逻辑运算的结果而定
2. OR 指令
- 描述:按位“或”逻辑运算
- 格式:OR DST,SRC
- 功能:双操作数,DST = DST or SRC
- 注意:OF = 0,CF = 0,AF不定,SF,ZF,PF根据逻辑运算的结果而定
3. NOT 指令
- 描述:按位:“非”逻辑运算
- 格式:NOT DST
- 功能:单操作数,DST = not DST
- 注意:影响标志位无
4. TEST 指令
- 描述:用于测试某一二进制位的值
- 格式:TEST DST,SRC
- 功能:双操作数,实际上是对DST,SRC进行“与”逻辑运算,但是不保留运算结果,测试结果在PSW中可以看出
- 注意:OF = 0,CF = 0,AF不定,SF,ZF,PF根据逻辑运算的结果而定
5. XOR 指令
- 描述:按位“异或”逻辑运算
- 格式:XOR DST,SRC
- 功能:双操作数,DST = DST ⊕ SRC
- 注意:OF = 0,CF = 0,AF不定,SF,ZF,PF根据逻辑运算的结果而定
6. SHL 指令、SAL 指令
- 描述:逻辑左移,算术左移
- 格式:SHL DST,1 或 CL(SAL DST,1 或 CL)
- 功能:双操作数,将DST的内容左移1位或CL位,并将结果保存在DST中
- 注意:
- 左移后低位(右端)补上响应位数的0,左移没有符号问题,所以逻辑左移和算术左移在结果上是一样的
- CF中始终存放最后被移出的数,AF不定,SF,ZF,PF依据结果而定,OF只在一位左移时有意义
7. SHR 指令
- 描述:逻辑右移
- 格式:SHR DST,1 或 CL
- 功能:双操作数,将DST逻辑右移1或CL位的结果保存在DST中
- 注意:
- 逻辑右移在最高位上直接补0
- CF始终保存最后被移出的值,AF不定,SF,ZF,PF依据结果而定,OF只在一位右移时有意义
8. SAR 指令
- 描述:算术右移
- 格式:SAR DST,1 或 CL
- 功能:双操作数,将DST算术右移1或CL位的结果保存在DST中
- 注意:
- 算术右移在最高位补的是符号位,也就是右移前最高位的值
- CF始终保存最后被移出的值,AF不定,SF,ZF,PF依据结果而定,OF只在一位右移时有意义
9. ROL 指令
- 描述:循环左移
- 格式:ROL DST,1 或 CL
- 功能:双操作数,循环左移,即最高位移向最低位
- 注意:最高位移向最低为的同时也会赋值给CF
10. ROR 指令
- 描述:循环右移
- 格式:ROR DST,1 或 CL
- 功能:双操作数,循环右移,即最低位移向最高位
- 注意:最低位移向最高位的同时也会赋值给CF
11. RCL 指令
- 描述:带进位的循环左移
- 格式:RCL DST,1或 CL
- 功能:双操作数,带进位的循环左移,即对 DST + CF 进行循环左移
- 注意:会改变CF的值
12. RCR 指令
- 描述:带进位的循环右移
- 格式:RCR DST,1 或 CL
- 功能:双操作数,带进位的循环右移,即对 CF + DST 进行循环右移
- 注意:会改变CF的值
串操作指令:
注意:当方向标志位DF = 0时,DI目的变址寄存器,SI源变址寄存器 +,方向标志位DF = 1时,DI目的变址寄存器,SI源变址寄存器 -。
1. MOVS 指令
- 描述:串传输
- 格式:
- i. MOVSB(字节)
- ii. MOVSW(字)
- iii. MOVSD(双字)
- 功能:零操作数,[ ES:DI ] = [ DS:SI ],根据传输的类型,分别将SI,DI 改变1,2,4
2. CMPS 指令
- 描述:串比较
- 格式:
- i. CMPSB(字节)
- ii. CMPSW(字)
- 功能:零操作数,[ ES:DI ] - [ DS:SI ],根据比较类型,分别将SI,DI改变1,2,4
- 注意:
- 串中每一个元素的比较都会改变所有标志位的值,所以串的比较通常需要和条件分支连用才有意义,否则显示的就是串的最后一个的比较值
- 比较不会保存减法的值,但会改变标志位
3. LODS 指令
- 描述:从源串中取数到 AX
- 格式:
- LODSB(字节)
- LODSW(字)
- LODSD(双字)
- 功能:零操作数:AL / AX / EAX = [ DS:SI ],根据取数的类型,分别将SI改变1,2,4
4. STOS 指令
- 描述:将AX中的值传输给目的串
- 格式:
- STOSB(字节)
- STOSW(字)
- STOSD(双字)
- 功能:零操作数:[ DS:DI ] = AL / AX / EAX ,根据取数的类型,分别将DI改变1,2,4
5. SCAS 指令
- 描述:在目的串中查找是否有AX中的内容
- 格式:
- SCASB(字节)
- SCASW(字)
- SCASD(双字)
- 功能:零操作数,实际上是用 AL / AX / EAX - [ DS:DI ] 对标志位的影响来判断查找结果,但是不保存减法的结果
6. 重复前缀指令
- 指令:
- a. REP 指令
- b. REPZ / REPE 指令
- c. REPNZ / REPNE 指令
- 描述:a. 一般用于MOVS、STOS、LODS前,b. c.一般用于SCAS、CMPS前,用于控制串操作的循环进行
- 格式:加在传操作指令的前面
- 功能:
- a. 每进行一次串操作指令,( CX ) - 1,直到( CX ) = 0,重复执行才会结束
- b. 每进行一次串操作指令,( CX ) - 1,直到( CX ) = 0 或 ZF = 0,重复执行才会结束,到不为零时停止
- c. 每进行一次串操作指令,( CX ) - 1,直到( CX ) = 0 或 ZF = 1,重复执行才会结束,到为零时停止
无条件控制转移指令
1. JMP 指令
- 描述:无条件跳转指令
- 格式:JMP ADDRESS
- 功能:无条件跳转到ADDRESS的位置上继续执行
条件控制转移指令
条件控制转移指令在使用前,一定要有改变FR状态标志位的相关指令操作,FR是判断是否进行条件转移的标志
单控制位转移:
1. JZ 指令
- 描述:标志条件为零时转移
- 格式:JZ ADDRESS
- 功能:ZF = 1时,跳转至ADDRESS继续执行,否则这条指令无效,继续顺序执行;ADDRESS通常是伪指令中的标号
2. JNZ 指令
- 描述:标志条件不为零时转移
- 格式:JNZ ADDRESS
- 功能:ZF = 0时,跳转至ADDRESS继续执行,否则这条指令无效,继续顺序执行
3. JC 指令
- 描述:有进借位时转移
- 格式:JC ADDRESS
- 功能:CF = 1时,跳转至ADDRESS继续执行,否则这条指令无效,继续顺序执行
4 JNC 指令
- 描述:无进借位时跳转
- 格式:JNC ADDRESS
- 功能:CF = 0时,跳转至ADDRESS继续执行,否则这条指令无效,继续顺序执行
5. JO 指令
- 描述:有溢出时跳转
- 格式:JO ADDRESS
- 功能:OF = 1时,跳转至ADDRESS继续执行,否则这条指令无效,继续顺序执行
6. JNO 指令
- 描述:没有溢出时跳转
- 格式:JNO ADDRESS
- 功能:OF = 0时,跳转至ADDRESS继续执行,否则这条指令无效,继续顺序执行
7. JS 指令
- 描述:为负数时跳转
- 格式:JS ADDRESS
- 功能:SF = 1时,跳转至ADDRESS继续执行,否则这条指令无效,继续顺序执行
8. JNS 指令
- 描述:不为负数时跳转
- 格式:JNS ADDRESS
- 功能:SF = 0时,跳转至ADDRESS继续执行,否则这条指令无效,继续顺序执行
9. JP 指令
- 描述:为偶数时跳转
- 格式:JP ADDRESS
- 功能:PF = 1时,跳转至ADDRESS继续执行,否则这条指令无效,继续顺序执行
10. JNP 指令
- 描述:不为偶数时跳转
- 格式:JNP ADDRESS
- 功能:PF = 0时,跳转至ADDRESS继续执行,否则这条指令无效,继续顺序执行
双控制位转移:
常用于使用CMP指令之后,其中#N = 不等于,#A = 无符号数大于,#B = 无符号数小于,#E = 等于,#G = 有符号数大于,#L = 有符号数小于
11. JA / JNBE 指令
- 描述:无符号数大于 或 不小于且不等于转移
- 格式:JA / JNBE ADDRESS
- 功能:CF = 0 且 ZF = 0,跳转至ADDRESS继续执行,否则这条指令无效,继续顺序执行
12. JG / JNLE 指令
- 描述:有符号数大于 或 不小于且不等于转移
- 格式:JG / JNLE ADDRESS
- 功能:CF = 0 且 ZF = 0,跳转至ADDRESS继续执行,否则这条指令无效,继续顺序执行
13. JAE / JNB 指令
14. JGE / JNL 指令
15. JB / JNAE 指令
16. JL / JNGE 指令
17. JBE / JNA 指令
18. JLE / JNG 指令
19. JCXZ指令
- 描述:当 CX = 0时跳转
- 格式:JCXZ ADDRESS
- 功能:当 CX = 0时,跳转至ADDRESS继续执行,否则这条指令无效,继续顺序执行
循环指令:
1. LOOP指令
- 描述:根据标志位和CX的值决定是否要进行循环转移
- 格式:LOOP 标号
- 功能:当 CX - 1 ≠ 0 时,进行循环转移,否则,退出循环,顺序执行
2. LOOPE / LOOPZ 指令
- 描述:相等 / 为零循环转移
- 格式:LOOPE / LOOPZ 标号
- 功能:当 CX - 1 ≠ 0 且 ZF = 1时,进行循环转移,否则,退出循环,顺序执行
子程序调用指令:
1. CALL 指令
- 描述:子程序调用
- 格式:
- i. CALL EX / ( NEAR PTR EX ) 短程调用
- ii. CALL FAR PTR EX 长调用
- 功能:
- i. 将IP(返回地址)保存,进栈,并无条件的转向子程序进行调用
- ii. 将CS,IP保存,进栈,并无条件的转向子程序的运行调用
2. RET 指令
- 描述:子程序调用返回
- 格式:RET num ( 一般为偶数 )
- 功能:
- 把由CALL压入堆栈内容弹出给IP,然后执行这条指令
- 将SP向高字节移动num位,这样就可以把执行CALL指令前压入堆栈的参数弹出作废,避免一些过时参数占用栈空间
中断指令:
1. INT 指令
- 描述:中断处理
- 格式:INT n ( 中断程序的入口地址 )
- 功能:将FR压入堆栈,并将IF,TF赋0;将CS压入堆栈,并将(4*n + 2)赋值给CS;将IP压入堆栈,并将(4*n)赋值给IP
- 注意:影响标志位,IF = TF = 0
2. IRET 指令
- 描述:中断返回
- 格式:IRET
- 功能:分别将IP,CS,FR存在堆栈中的内容出栈
- 注意:这条指令可能会影响所有的标志位
空操作指令:
NOP 指令
标志修改指令:
#CL = clean(置零),#ST = set(置一),#CM = complement(取反)
CF 进位标志,DF 方向标志,IF 中断允许标志
1. CLC 指令
2. STC 指令
3. CMC 指令
4. CLD 指令
5. STD 指令
6. CLI 指令
7. STI 指令