汇编指令汇总

  • 传送指令
    • 通用传送指令
      • MOV ——字节或字的传送指令
        • MOV reg/mem,imm(无seg,立即数不能直接赋给段寄存器,且不能作为目的操作数(无法存储)以字母开头的常数要有前导0)
        • MOV reg/men/seg,reg(寄存器具有明确的字节和字类型,但任何变量使用前都要先定义)
        • MOV reg/seg,mem(不存在存储器向存储器的传送指令)
        • MOV reg/men,seg(无seg)
        • 代码段段寄存器(CS)不能作为目的操作数
        • SS没必要赋值,系统会默认指定
        • DS、ES的段基地址可以相同
        • 要记得 MOV AX,DATA[BX][SI],其中DATA作为变量时,是其偏移地址与BX、SI的内容相加,作为相对基址变址寻址
        • 图示

          汇编指令汇总_第1张图片

        • 非法指令的主要现象
          • 两个操作数的类型不一致
          • 无法确定是字节量还是字量操作(eg.立即数传给变量,要先定义变量(最好给出类型说明),否则无法确定;eg.立即数传给存储单元,要先类型说明,否则无法确定)
          • 两个操作数都是存储器(8086指令系统除串操作指令外,不允许两个操作数都是存储单元(存储单元操作数))
          • 段寄存器的操作有所限制
          • 要记得只有AX、BX、CX、DX才能分为H、L;且思维要严谨,DH要先清零,否则传送的数可能变了(以保证数的大小不变,只是位扩)

            汇编指令汇总_第2张图片

          • AX在CPU内部,不会出现在存储器,所以应该改为ES:[AX]

          • DX不能作为存储器操作数表达式(即不能作为寄存器间接寻址)

      • 堆栈操作指令
        • 先进后出(FILO)、后进先出(LIFO),但可随机读取
        • 堆栈只有一个出/入口,即当前栈顶,用堆栈指针寄存器SP指定
        • 申请好存储空间后,SS指向最小偏移地址,SP(栈顶指针)指向指向最大的存储空间(存储时仍为小端方式)
        • 堆栈操作的单位为“字”
        • 堆栈在程序执行中,可以用来中间缓存或者存储段内调用/段间调用时的偏移地址/段地址+偏移地址
        • 堆栈指令中的操作数只能是寄存器或存储器操作数,不能是立即数
        • 堆栈操作遵循先进后出原则(SP),但可用存储器寻址方式(BP)随机存取堆栈中的数据
        • PUSH——入栈指令
          • PUSH r16/m16/seg 即 SP⬅SP-2;SS:[SP]⬅r16/m16/seg
          • 记得SP先减2
          • SP指向当前最大的存储单元
          • 对字进行操作
          • 存放时为小端方式,但是先放高位再放低位,即进栈时SP-2
        • POP——出栈指令
          • POP r16/m16/seg 即 r16/m16/seg⬅SS:[SP]; SP⬅SP+2
          • 记得先出栈再减2
          • 对字进行操作
          • 出栈指令把栈顶的一个字传送至指定的目的操作数
          • 不能编程执行 POP CS
      • XCHG——字节或字的交换指令
        • XCHG reg reg/mem
        • XCHG mem reg
        • 交换的类型要相同,且不能在存储器与存储器之间对换数据
      • XLAT——字节的查表指令(对于既定的表进行查找)
        • 将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL(要注意:BX指定的为0,如果AL为3,是指0、1、2、3中的3)
        • 在主存中建立一个字节量表格,内含要转换成的目的代码
        • 表格首地址存放于BX,AL存放相对表格首地址的位移量
        • 记得,是将AL寄存器的内容转换成目标代码

    • 目的地址传送指令
      • LEA——有效地址传送指令
        • 将存储器操作数的有效地址送至指定的16位通用寄存器
        • 源操作数为操作数的有效地址(即存放操作数的存储单元的地址)
        • LEA r16,mem (等价于 MOV r16,OFFSET mem)
      • LDS——偏移地址及其数据段段地址传送指令
        • LDS r16,mem
        • 从mem存储单元开始的4个连续存储单元中取出某变量的地址指针(共4个字节),将其前两个字节(即变量的偏移地址)传送到r16,后两个字节(即变量的段地址)传送到DS段寄存器中
        • 为32位操作指令
      • LES——偏移地址及其附加段段地址传送指令
        • LES r16,mem
        • 从mem存储单元开始的4个连续存储单元中取出某变量的地址指针(共4个字节),将其前两个字节(即变量的偏移地址)传送到r16,后两个字节(即变量的段地址)传送到ES段寄存器中
        • 为32位操作指令
    • I/O传送指令
      • I/O口地址为8位时,口地址为“立即数”
      • I/O口地址为16位时,口地址应存放在“DX”中,且不加方括号
      • IN/OUT指令,必须应用累加器AX/AL

        汇编指令汇总_第3张图片

      • IN——I/O操作的输入指令
        • IN AX/AL,i8/DX
        • IN指令是将指定端口 i8/DX 中的内容输入到累加器AL/AX中
        • 只能传到AX/AL
        • i8表示8位端口号,DX中的内容为16位端口号
      • OUT——I/O操作的输出指令
        • OUT i8/DX,AX/AL
        • OUT指令是将累加器AX/AL中的内容输出到指定端口i8/DX
    • 标志传送指令
      • PUSHF——标志寄存器入栈指令
        • 将16位标志寄存器F内容入栈保护
      • POPF——出栈至标志寄存器指令
        • 将当前栈顶和次栈顶中的数据字弹出送回到标志寄存器F中
      • LAHF——SF、ZF、AF、PF、CF对位传送至AH(SF、ZF、、AF、、PF、、CF)
        • 将标志寄存器F的低字节(共包含5个状态标志位)传送到A寄存器中
      • SAHF——AH对位传送至SF、ZF、AF、PF、CF
        • 将AH寄存器内容传送到标志寄存器F的低字节
      • 对位传送

        汇编指令汇总_第4张图片

  • 算术运算类指令
    • 注意:这类指令会根据运算结果影响状态标志,有时要利用某些标志才能得到正确的结果,使用时亚奥注意有关状态标志的变化
    • 加法运算
      • 无符号数的加减法运算,计算小数点后的数的相加或相减时,用ADD或SUB;计算后,要带CF的ADC或SBB计算整数,逻辑要很清晰

        汇编指令汇总_第5张图片

      • ADD——普通加法指令(目的⬅目的+源)
        • ADD dest,src
        • ADD指令使目的操作数加上源操作数,和的结果送到目的操作数
        • 注意,无论是有符号或无符号数运算,都会影响OF,只不过无符号数关注CF,有符号数关注OF

          汇编指令汇总_第6张图片

        • 注意对OF、SF、ZF、PF、CF的影响
      • ADC——带进位位加法指令(目的⬅源+目的+CF)
        • 注意:CF是指令执行前CF的标志
      • INC——加一指令(目的⬅目的+1)
        • 不影响CF标志,而ADD、ADC等会影响
        • INC reg/mem
        • 单操作数指令
      • AAA——非组合BCD码加法的加六修正指令
        • 非组合BCD码➡Eg. 69H=(0000 0110 0000 1001)BCD=0609H
        • 字节操作
        • 隐含寄存器为AL,因此需要先将代调整的数,ADD或ADC后到AL(目的操作数),然后调整之后传到指定位置,且未组合BCD码要按每个十进制位计算
      • DAA——组合BCD码加法的加六修正指令
        • 字节操作
        • 隐含寄存器为AL,因此需要先将代调整的数,ADD或ADC后到AL(目的操作数),然后调整之后传到指定位置,且未组合BCD码要按每个十进制位计算
    • 减法运算
      • SUB——普通减法指令(目的⬅目的-源)
        • SUB dest,src
        • SUB指令使目的操作数减去源操作数,差的结果送到目的操作数
        • 注意对OF、SF、ZF、PF、CF的影响
      • SBB——带进位位减法指令(目的⬅目的-源-CF)
        • 注意:CF是指令执行前CF的标志
      • DEC——减一指令(目的⬅目的-1)
        • 不影响CF标志,而SUB、SBB等会影响
        • DEC reg/mem
        • 单操作数指令
      • NEG——(把操作数作为无符号数)求补指令
        • NEG reg/mem 即 reg/mem⬅0-reg/mem
        • NEG指令对标志的影响与用零作减法的SUB指令一样
        • 单操作数指令
        • 把操作数作为无符号数
        • 若操作数为正数或无符号数,NEG指令是求与正数真值相等的负数的补码
        • 若操作数为有符号数或补码,NEG指令是求一负数的绝对值
      • CMP——比较指令(目的-源,只影响FLAGS寄存器)
        • 结果不回传目的,不影响两操作数的值
        • CMP dest,src
        • 比较指令通过减法运算影响状态标志(6个状态标志位),用于比较两个操作数的大小关系
        • 无符号数比较大小(若ZF=1,两数相等;若ZF=0,判断CF)

          汇编指令汇总_第7张图片

        • 有符号数比较大小(若ZF=1,两数相等;若ZF=0,判断SF、OF)

          汇编指令汇总_第8张图片

      • AAS——未组合BCD码的减法减六修正指令
        • 字节操作
        • 隐含寄存器为AL,因此需要先将代调整的数,ADD或ADC后到AL(目的操作数),然后调整之后传到指定位置,且未组合BCD码要按每个十进制位计算
      • DAS——组合BCD码减法的减六修正指令
        • 字节操作
        • 隐含寄存器为AL,因此需要先将代调整的数,ADD或ADC后到AL(目的操作数),然后调整之后传到指定位置,且未组合BCD码要按每个十进制位计算
    • 乘法运算
      • MUL——无符号数乘法指令
        • MUL reg/mem
        • (被乘数)隐含寄存器是AL(字节乘)与AX(字乘)
        • 乘数不能是立即数
        • 乘积存入AX(字节乘)和DX(字乘)
        • CF=OF=0
          • 表示AL或AX中乘积有效
          • 表示AH或DX中的乘积为0
          • 注意:AH或DX要先清零
        • CF=OF=1
          • 表示AX或DX:AX中的乘积均有效
      • IMUL——带符号数(整数)乘法指令
        • 补码运算,最后结果也是补码
        • IMUL reg/mem
        • (被乘数)隐含寄存器是AL(字节乘)与AX(字乘)
        • 乘数不能是立即数
        • 乘积存入AX(字节乘)和DX(字乘)
        • CF=OF=0
          • 表示AL或AX中乘积有效
          • 表示AH或DX中的乘积为0或全F(有符号数,负数符号位为1)
          • 注意:AH或DX要先清零
        • CF=OF=1
          • 表示AX或DX:AX中的乘积均有效
          • 表示AH或DX中的乘积全0或全F
        • 计算过程分析

      • AAM——未组合BCD码的乘法修正指令
        • 隐含寄存器为AX
        • 只能够修正 未组合BCD码 字节乘法 的积
        • 在乘积之后修正
    • 除法运算
      • DIV——无符号数除法指令
        • DIV reg/mem
        • (被除数)隐含寄存器是AX(字节除)与DX:AX(字除)
        • 除数不能是立即数、
        • 商存入AL(字节除)与AX(字除)中
        • 余数存入AH(字节除)与DX(字除)中
        • 高余低商
        • 除法指令不影响标志寄存器FLAGS的状态标志
        • 除数为零或商超出累加器的容量,产生除法错中断,即0型中断
      • IDIV——带符号数除法指令
        • IDIV reg/mem
        • (被除数)隐含寄存器是AX(字节除)与DX:AX(字除)
        • 除数不能是立即数、
        • 商存入AL(字节除)与AX(字除)中
        • 余数存入AH(字节除)与DX(字除)中
        • 高余低商
        • 除法指令不影响标志寄存器FLAGS的状态标志
        • 除数为零或商在补码范围之外,产生除法错中断,即0型中断
      • AAD——未组合BCD码的除法修正指令
        • 隐含寄存器为AX
        • 只能够修正未组合BCD码字节除法的被除数
        • 在除法之前进行调整操作——将累加器AX中的2位非压缩型十进制的被除数调整为二进制数,保留在AL中
      • 位扩展指令
        • CBW——带符号数“字节”扩展为“字”的指令
        • CWD——带符号数“字”扩展为“双字”的指令
        • CBW和CWD:为IDIV指令设置的符号扩展指令,用来扩展被除数字节/字为字/双字的符号,所扩充的高位字节/字部分均为低位的符号位。它们在使用时应安排在IDIV指令之前,执行结果对标志位没有影响。
        • 对DIV无符号数除法应该采用直接使高8位或高16位清0的方法,以获得倍长的被除数。
        • 位数加长,大小没变
  • 位操作类指令
    • 以二进制位为基本单元进行数据的操作
    • 双操作数逻辑指令AND、OR、XOR和TEST设置CF=OF=0(固定为 0,结果不影响),根据结果设置SF、ZF和PF状态,而对AF未定义
    • 逻辑运算
      • AND——按位“与”逻辑运算指令
      • OR——按位“或”逻辑运算指令
      • NOT——按位“非”逻辑运算指令
        • 单操作数
        • 结果不影响标志位
      • XOR——按位“异或”逻辑运算指令
      • TEST——按位“位测试”(与逻辑)逻辑运算指令
        • 对两个操作数执行逻辑与运算,结果并不送目的操作数,仅按AND指令影响标志
        • AND与TEST指令的关系,同SUB与CMP指令的关系一样
        • TEST指令是将字节/字操作数按位进行“与”运算
        • TEST指令不影响原操作数
        • TEST指令只影响标志寄存器FLAGS的状态标志
        • 要学会利用TEST指令

          汇编指令汇总_第9张图片

      • 综合应用一 (记得加上符号位)

        汇编指令汇总_第10张图片

      • 综合应用二——AND可以用来清零;OR用来置1;XOR用来取反(与1异或)

        汇编指令汇总_第11张图片

    • 移位指令
      • 移位指令的第一个操作数是指定的被移位的操作数,可以是寄存器或存储单元;后一个操作数表示移动的位数:
        • 该操作数为1,表示移动一位
        • 该操作数大于1,用CL寄存器值表示移位位数 (只能用CL表示)
        • 移位指令均影响标志寄存器FLAGS的“CF”标志位
      • 按照移入的位来设置进位标志CF,根据移位后的结果影响SF、ZF、PF
      • SAR是对带符号数操作,SHR是对无符号数操作

        汇编指令汇总_第12张图片

      • 很好的例子!要学会分析和思考(记得AH先清零)

        汇编指令汇总_第13张图片

      • 算术移位
        • SAL——按位“算术左移”运算指令
          • SAL reg/mem,1/CL
          • 最低位补0,最高位进入CF
          • 左移一位相当于“x2”(最高有效位1未被移出前),移动8位后全部为0
        • SAR——按位“算术右移”运算指令
          • SAR reg/mem,1/CL
          • 最高位不变(保持符号位不变),最低位进入CF
      • 逻辑移位
        • SHL——按位“逻辑左移”运算指令
          • SHL reg/mem,1/CL
          • 最低位补0,最高位进入CF
          • 左移一位相当于“x2”(最高有效位1未被移出前),移动8位后全部为0
        • SHR——按位“逻辑右移”运算指令
          • SHR reg/mem,1/CL
          • 最高位补0,最低位进入CF
          • 右移一位相当于“➗2”,移动8位后全部为0
    • 循环移位指令
      • 循环移位指令的操作数形式与移位指令相同,按指令功能设置进位标志CF(都会影响CF!不带进位循环移位也会影响),但不影响SF、ZF、PF、AF标志(要特别注意!)
      • 图示,注意移入CF的位

        汇编指令汇总_第14张图片

      • 这道题要特别注意,要考虑全面,以及不能使用ROL和RCR是因为非压缩BCD码高4位是任意的,不一定全为0

        汇编指令汇总_第15张图片

      • ROL——按位“循环左移”运算指令
        • ROL reg/mem,1/CL
        • 不带进位循环左移
      • ROR——按位“循环右移”运算指令
        • ROR reg/mem,1/CL
        • 不带进位循环右移
      • RCL——按位“带进位位循环左移”运算指令
        • RCL reg/mem,1/CL
        • 带进位循环左移
      • RCR——按位“带进位位循环右移”运算指令
        • RCR reg/mem,1/CL
        • 带进位循环右移
  • 串操作指令(默认的ES不能用超越前缀改变([DI])
    • 特点
      • 通常须用“SI”、“DI”、“CX”、“ES”寄存器
      • 应严格区分源(SI)与目的(DI)寄存器的使用
      • SI与DI地址自动改变的方向,由D的值控制(CLD即DF=0,递增;STD即DF=1,递减)CLD和STD只在串操作中起作用
      • CX作为计数器,特别是应用重复前缀指令时
      • B为字节操作、 W为字操作,无操作数指令
      • 运用(隐含条件:CX-1≠0;CX为隐含计数器,用于REP、LOOP、REPZ、REPNZ),如果只有跳转指令,要DEC CX,判断ZF跳转

        汇编指令汇总_第16张图片

    • MOVS——串传送指令
      • ES: [DI] ← DS:[SI]
      • MOVSB、MOVSW
      • 若要在同一个段内,可以将ES和DS赋相同的值
      • 单独使用MOVS时,要记得两个操作数都要加上同样的类型说明
    • LODS——读串操作指令
      • AX/AL ← DS:[SI]
      • LODSB、LODSW
      • 对处理器而言,读是读入,写是写出;对存储器而言,读是读出,写是写入
      • 应用举例

        汇编指令汇总_第17张图片

    • STOS——写串操作指令
      • ES: [DI] ← AL/AX
      • STOSB、STOSW
      • 应用举例

        汇编指令汇总_第18张图片

    • CMPS——串比较指令
      • ES: [DI] — DS:[SI]
      • CMPSB、CMPSW
      • 按位一一进行比较
      • 应用举例 记得那个DEC

        汇编指令汇总_第19张图片

    • SCAS——串搜索指令
      • AX/AL— ES: [DI]
      • 待查关键字放在AL/AX
      • SCASB、SCASW
      • 找到时,ZF=1
      • 应用举例

        汇编指令汇总_第20张图片

    • 重复前缀
      • REP——无条件重复前缀
        • Eg.串传递未传递结束
      • REPE/PEPZ(ZF=1)——零条件重复前缀指令
      • REPNE/REPNZ——非零条件重复前缀指令
        • Eg.比较串时,位置对应未不相等时结束比较
  • 寄存器的应用

    汇编指令汇总_第21张图片

  • 控制指令
    • 控制转移类指令通过改变IP(和CS)值,实现程序执行顺序的改变(理解:IP是指向下一条要执行的指令)
    • 目标地址的寻址方式
      • 相对寻址方式
        • 指令代码中提供目的地址相对于当前IP的位移量,将要转移到的目的地址(转移后的IP值)就是当前IP值加上位移量
        • 用标号表达
      • 直接寻址方式
        • 指令代码中提供目的逻辑地址,转移后的CS和IP值直接来自于指令操作码后的目的地址操作数
        • 用标号表达
      • 间接寻址方式
        • 指令代码中指示寄存器或存储单元,目的地址从寄存器或存储单元中间接获得
        • 用寄存器或存储器操作数表示
      • 段内寻址
        • 段内转移——近转移(near)
          • 在当前代码段64KB(±32KB)范围内转移
          • 不需要更改CS段地址,只要改变IP偏移地址(所以IP偏移地址入栈,出栈偏移地址)
        • 段内转移——短转移(short)
          • 转移范围可以用一个字节表达,在段内-128~+127范围的转移
        • 段间转移——远转移(far)
          • 从当前代码段跳转到另一个代码段,可以在1MB范围(20根地址总线)
          • 需要更改CS段地址和IP偏移地址
          • 目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址
        • 实际编程时,汇编程序会根据目标地址的属性,自动处理成短转移、近转移或远转移
        • 程序员可用操作符short、near ptr 或far ptr 强制成为需要的转移类型
    • JMP——无条件转移指令(记得看动画)
      • JMP label
      • 只要执行无条件转移指令JMP,就使程序转到指定的目标地址,从目标地址处开始执行指令
      • 操作数label是要转移到的目标地址(目的地址、转移地址)
      • 4种类型
        • JMP label; IP⬅IP+位移量——段内转移、相对寻址
        • JMP r16/m16;IP⬅r16/m16——段内转移、间接寻址
        • JMP far ptr label;IP⬅偏移地址,CS⬅段地址——段间转移、直接寻址
        • JMP far ptr mem;IP⬅[mem],CS⬅[mem+2]——段间转移、间接寻址
          • 寄存器只能16位,所以必须用存储器
    • Jcc——条件转移指令(标志位)
      • 6个标志位,OF、SF、ZF、PF、AF、CF
      • Jcc指令不影响标志,但要利用标志

        汇编指令汇总_第22张图片

      • Jcc label——label是一个标号、一个8位位移量,表示Jcc指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移,label只支持短转移(-128~+127)的相对寻址方式;IP←IP+8位位移量
      • ①判断单个标志位状态

        汇编指令汇总_第23张图片

        • JZ/JE和JNE/JNE(E=Equal ,Z=zero)——利用零标志ZF,判断结果是否为零(或相等)
        • JS和JNS——利用符号标志SF,判断结果是正是负(常结合TEST使用)
        • JO/JNO——利用溢出标志OF,判断结果是否产生溢出
        • JP/JPE(even偶)和JNP/JPO(odd奇)——利用奇偶标志PF,判断结果中“1”的个数是偶是奇
        • JC/JNC——利用进位标志CF,判断结果是否进位或借位
        • 例题
          • 要特别注意第三种方法,不能使用循环指令,因为循环指令不影响SF、ZF、PF标志位
        • 奇偶校验,要记得AND,OR,XOR都隐含条件:CF=OF=0
      • ②比较无符号数高低
        • 无符号数的大小用高(Above)、低(Below)表示,需要利用CF确定高低、利用ZF标志确定相等(Equal)
        • 转移指令

          汇编指令汇总_第24张图片

      • ③比较有符号数大小
        • 判断有符号数的大(Greater)、小(Less),需要组合OF、SF标志、并利用ZF标志确定相等与否
        • 转移指令

          汇编指令汇总_第25张图片

      • ④判断CX寄存器转移指令
        • 格式:JCXZ 标号;转移条件:(CX)= 0
    • CALL——调用过程(子程序)指令
      • 当主程序(调用程序)需要执行子程序时,采用CALL调用指令转移到该子程序的起始处执行
      • 子程序要有RET返回指令回到主程序继续执行
      • 转移指令有去无回,子程序调用需要返回,其中利用堆栈保存返回地址
      • 四种类型
        • CALL label——段内调用、直接寻址
          • 入栈偏移地址IP
          • SP←SP-2,SS:[SP]←IP
          • RET ;无参数段内返回
          • RET i16 ;有参数段内返回
          • 段内返回——出栈偏移地址IP
          • IP←SS:[SP], SP←SP+2
        • CALL r16/m16——段内调用、间接寻址
          • 入栈偏移地址IP
          • SP←SP-2,SS:[SP]←IP
          • RET ;无参数段内返回
          • RET i16 ;有参数段内返回
          • 段内返回——出栈偏移地址IP
          • IP←SS:[SP], SP←SP+2
        • CALL label——段间调用、直接寻址
          • 入栈偏移地址IP和段地址CS
            • ①SP←SP-2,SS:[SP]←CS
            • ②SP←SP-2,SS:[SP]←IP
          • RET ;无参数段间返回
          • RET i16 ;有参数段间返回
          • 段间返回——出栈偏移地址IP和段地址CS
            • ①IP←SS:[SP],SP←SP+2
            • ②CS←SS:[SP],SP←SP+2
        • CALL far ptr mem——段间调用、间接寻址(只能是mem,32位逻辑地址)
          • 入栈偏移地址IP和段地址CS
            • ①SP←SP-2,SS:[SP]←CS
            • ②SP←SP-2,SS:[SP]←IP
          • RET ;无参数段间返回
          • RET i16 ;有参数段间返回
          • 段间返回——出栈偏移地址IP和段地址CS
            • ①IP←SS:[SP],SP←SP+2
            • ②CS←SS:[SP],SP←SP+2
    • RET——过程(子程序)返回指令
    • JCXZ——判断CX寄存器转移指令(CX=0跳转)
      • 当CX=0时跳转
      • 可以用在作为循环的条件,每次循环都会执行 DEC CX ,之后判断CX=0?,然后跳转
    • 循环指令(短地址寻址)
      • CX作为隐含计数器,判断条件CX-1=0?
      • LOOP label——无条件循环指令
        • 首先CX←CX-1;然后判断;若CX≠0,转移
      • LOOPE/LOOPZ——零条件循环指令
        • 首先CX←CX-1;然后判断;若CX≠0,ZF=1, 转移
        • 循环结束条件:ZF=0或CX-1=0
      • LOOPNE/LOOPNZ——非零条件循环指令
        • 首先CX←CX-1;然后判断;若CX≠0,ZF=0, 转移
        • 循环结束条件:ZF=1或CX-1=0
    • 中断指令
      • 中断执行和返回时,SP和IP的状态
        • ①中断执行时:a.当前FLAGS入栈 b.当前CS入栈 c.当前IP入栈
        • ②根据中断向量:(中断服务程序首地址)➡ IP;(中断服务程序段地址)➡ CS
        • ③中断返回时:a.IP出栈 b.CS出栈 c.FLAGS出栈
      • INT——中断指令
        • 8086CPU支持256种中断,每种中断用一个编号(中断向量号)区别,前32个由Intel提供给系统用
        • INT 中断类型号(i8——0~255)/INTO
        • 中断类型号的范围:0~255
        • 中断向量(矢量):中断类型号x4(提供中断入口)
      • INTO——溢出中断指令
        • 无操作数指令,中断类型号=4
      • IRET——中断返回指令
        • 先打断最后恢复,后打断最先恢复(堆栈压入和弹出地址)
      • 中断执行步骤
        • ①在AH寄存器中设置系统功能调用号
        • ②在指定寄存器中设置入口参数
        • ③用中断调用指令( INT i8)执行功能调用
        • ④根据出口参数分析功能调用执行情况
      • INT 21H 功能号
        • AH⬅功能号
        • 功能号的使用及功能、入口参数、出口参数(要特别注意出、入口参数)

          汇编指令汇总_第26张图片

        • 记得输出字符串,最后必须添加一个'$'结尾(并不显示)
      • ROM-BIOS功能调用
        • 中断调用BIOS功能格式
          • 入口寄存器与参数赋值
          • AH⬅功能号
          • INT 中断类型号
        • BIOS中断功能举例(熟悉 MOV AH,0EH INT 10H 通常BX=0)

          汇编指令汇总_第27张图片

  • 8086微处理器CPU控制指令
    • 标志操作
      • CLC——进位标志位置“0”指令
      • CMC——进位标志位置求反指令
      • STC——进位标志位置“1”指令
      • CLD——方向标志位置“0”指令(地址递增)
      • STD——方向标志位置“1”指令(地址递减)
      • CLI——中断标志位置“0”指令(禁止中断)
      • STI——中断标志位置“1”指令(允许中断)
      • 进位标志清零的方法举例
        • ①CLC
        • ②XOR AX,AX
        • ③ADD AX,0
    • 操作微处理器
      • HLT——微处理器暂停指令
        • 暂停指令:CPU进入暂停状态
        • 用法
          • ①控制主程序的结尾
          • ②控制主程序等待中断
          • ③控制程序中不能够用返回DOS中断方式
      • NOP—— 微处理器空操作指令、
        • 空操作指令,等同于“xchg ax,ax” 指令
        • 一般用于延时

          汇编指令汇总_第28张图片

      • ESC—— 微处理器脱离指令(命令协处理器)
      • WAIT——微处理器等待指令
      • LOCK——微处理器锁定指令(指令前缀,总线锁定前缀)

你可能感兴趣的:(汇编,编辑器)