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 指令

 

posted @   Tatsukyou  阅读(1717)  评论(4编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示