• x86汇编指令整理


    1,寻址方式
        1,立即数寻址
            MOV AX, 0102H    ;AX←0102H
        2、寄存器寻址方式
            指令中指明某个寄存器其内容即为操作数,寄存器在CPU内,不用总线周期,执行速度快。
            8位寄存器r8:
            AH、AL、BH、BL、CH、CL、DH、DL
            16位寄存器r16:
            AX、BX、CX、DX、SI、DI、BP、SP
            4个段寄存器seg:
            CS、DS、SS、ES
            MOV AX, BX    ;AX←BX
        3,直接寻址方式
            指令中直接给出操作数所在内存单元的有效地址
           (EA即偏移地址)
            默认的段地址在DS段寄存器,若在其它段可使用段超越前缀改变。
            用方括号包含有效地址,表达存储单元的内容
            直接地址也可用标号代表,方括号可省略。
            MOV AX, [2000H]    ;AX←DS:[2000H]
            MOV AX, ES: [2000H]    ;AX←ES:[2000H]
        4、寄存器间接寻址方式
            指令中给出的寄存器的内容包含操作数的有效地址。
            间接寻址中使用的寄存器名要用方括号括起来
            1、基址寻址  用BX或BP作间接寻址寄存器
              如:MOV  AX,[BX] ;隐含在DS段
                  MOV  AX,[BP] ;隐含在SS段
            2、变址寻址    用SI或DI作间接寻址寄存器
                如:MOV  CL, [SI]
                 MOV  AX, [DI]
                单独使用SI或DI时,隐含在DS段中
                在串操作时,SI隐含在DS段中,DI隐含在ES段中。
            3、相对基址寻址
                指令中给出基址寄存器及位移量,二者之和为操作数的有效地址。
                位移量可以是8位或16位。
                有效地址=BX/BP+8/16位位移量
            4、相对变址寻址     
                指令中给出变址寄存器及位移量,二者之和为操作数的有效地址。
                有效地址=SI/DI+8/16位位移量
                段地址对应BX/SI/DI寄存器默认是DS,对应BP寄存器默认是SS;可用段超越前缀改变
                MOV AX, [SI+06H]    ;AX←DS:[SI+06H]
                MOV AX, 06H[SI]    ;AX←DS:[SI+06H]
            5、 基址变址寻址方式
                有效地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成:
                有效地址=BX/BP+SI/DI
                段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变
                MOV AX, [BX+SI]    ;AX←DS:[BX+SI]
                MOV AX, [BX][SI]    ;AX←DS:[BX+SI]
            6、 相对基址变址寻址方式
                有效地址是基址寄存器(BX/BP)、变址寄存器(SI/DI)与一个8位或16位位移量之和:
                有效地址=BX/BP+SI/DI+8/16位位移量
                段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变
                MOV AX, [BX+DI+6]    ;AX←DS:[BX+DI+6]
                MOV AX, 6[BX+DI]        MOV AX, 6[BX][DI]
    各种寻址方式综合举例
        设BX=1200H   DI=10A0H   位移量=2BC0H
        DS=2400H 求各种寻址方式下的有效地址和物理地址。
        ①  直接寻址    指令形式: MOV  AX, [2BC0H]
             EA= 2BC0H
             物理地址=24000H+2BC0H=26BC0H
        ②  基址寻址     指令形式: MOV  AX, [BX]
             EA= 1200H
            物理地址=24000H+1200H=25200H
        ③  变址寻址     指令形式: MOV  AX, [DI]
         EA= 10A0H
         物理地址=24000H+10A0H=250A0H
        ④  相对基址寻址     MOV  AX, [BX+2BC0H]
             EA= 1200H+2BC0H=3DC0H
             物理地址=24000H+3DC0H=27DC0H
        ⑤  相对变址寻址     MOV  AX, [DI+2BC0H]
             EA= 10A0H+2BC0H=3C60H
             物理地址=24000H+3C60H=27C60H
        ⑥相对基址变址寻址   
             MOV  AX,   [BX+DI+2BC0H]
             EA= 1200H+10A0H+2BC0H=4E60H
             物理地址=24000H+4E60H=28E60H
     注意:
         一般指令中不出现段寄存器名称,而用隐含关系指明。
        如与隐含关系不同,运用前缀改变。
        ① [BX]  隐含于DS段
        ② [BP]  隐含于SS段
        ③ [SI]、[DI]单独使用隐含于DS段
        ④ 基址寄存器和变址寄存器同时出现,以基址寄存器隐含关系为准。
        ⑤    [SP] 隐含于SS段
        ⑥    [SI]、[DI]用于串操作时,[SI]隐含于DS段,
              [DI]隐含于ES段。

        使用前缀的形式
             ADD    AX, ES:[SI]
            或   ES:ADD   AX, [SI]
            
    §3    8086指令系统
        8086指令系统很丰富,包含133条基本指令,功能强。
            一般分为五类来介绍
            传送指令,算术运算指令,逻辑运算和移位指令,串操作指令,控制转移指令
        一、数据传送类指令
            数据传送是计算机中最基本、最重要的一种操作,传送指令也是最常使用的一类指令
            传送指令把数据从一个位置传送到另一个位置
            除标志寄存器传送指令外,均不影响标志位
            重点掌握
            MOV  XCHG  PUSH  POP XLAT LEA
        1、通用数据传送指令
                提供方便灵活的通用传送操作
                有3条指令
                MOV
                XCHG
                PUSH  POP
            ①  基本传送指令MOV(move)
                mov cl,4    ;cl←4,字节传送
                mov dx,0ffh    ;dx←00ffh,字传送
                mov si,200h    ;si←0200h,字传送
                mov bvar,0ah    ;字节传送
                ;假设bvar是一个字节变量,定义如下:bvar  db 0
                mov wvar,0bh    ;字传送
                ;假设wvar是一个字变量,定义如下:wvar  dw 0
                mov al,[bx]        ;al←ds:[bx]
                mov dx,[bp]        ;dx←ss:[bp+0]
                mov dx,[bp+4]    ;dx←ss:[bp+4]
                mov es,[si]        ;es←ds:[si]
                2,非法指令的主要现象:
                    两个操作数的类型不一致
                    无法确定是字节量还是字量操作
                    两个操作数都是存储器
                    段寄存器的操作有一些限制
                    例子:
                    1、当无法通过任一个操作数确定是操作类型时,需要利用汇编语言的操作符显式指明
                        MOV [BX+SI], 255    ;非法指令,修正:
                        ;mov byte ptr [bx+si],255
                        ;byte ptr 说明是字节操作
                        ;mov word ptr [bx+si],255
                        ;word ptr 说明是字操作
                    2,8088指令系统除串操作指令外,不允许两个操作数都是存储单元(存储器操作数)
                        MOV buf2, buf1  如  MOV  [BX],[SI]    
                    3,MOV DS, ES    ;非法指令,修正:
                                    ;mov ax,es
                                    ;mov ds,ax
                        MOV DS, 100H    ;非法指令,修正:
                                        ;mov ax,100h
                                        ;mov ds,ax
                         MOV CS, [SI]    ;非法指令
                                        ;指令存在,但不能执行

            ②  交换指令XCHG(exchange)
                XCHG reg,reg/mem
                    ;reg  reg/mem
                寄存器与寄存器之间对换数据
                寄存器与存储器之间对换数据
                不能在存储器与存储器之间对换数据
                例子:    
                    mov ax,1199h    ;ax=1199h
                    xchg ah,al    ;ax=9911h
                                ;等同于 xchg al,ah
                    mov wvar,5566h    ;wvar是一个字量变量
                    xchg ax,wvar     ;ax=5566h,wvar=9911h
                                    ;等同于 xchg wvar,ax
                    注意:不能在两个内存单元之间交换
                        如:XCHG   [BX],[SI]  错误!
                            段寄存器中CS、IP不能做操作数
            ③   堆栈操作指令
            1.堆栈是一个“后进先出LIFO”(或说“先进后出FILO”)的主存区域,位于堆栈段中;SS段寄存器记录其段地址
            堆栈只有一个出口,即当前栈顶;用堆栈指针寄存器SP指定
            2,堆栈只有两种基本操作:进栈和出栈,对应两条指令PUSH和POP
            堆栈由栈底向低地址方向生成
                push:进栈指令先使堆栈指针SP减2,然后把一个字操作数存入堆栈顶部
                    如:push ax
                        push [2000h]
                出栈指令POP:出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指针SP加2
                    如:pop ax
                        pop wvar
            3,堆栈操作的特点
                堆栈操作的单位是字,进栈和出栈只对字进行
                数据从栈顶压入和弹出时,都是低地址送低字节,高地址送高字节
                堆栈操作遵循先进后出原则,但可用存储器寻址方式随机存取堆栈中的数据
                堆栈段是程序中不可或缺的一个内存区,常用来
                    临时存放数据
                    传递参数
                    保存和恢复寄存器
        2、累加器专用传送指令
            ① 输入输出指令(IN/OUT指令)
           格式:IN   AL,port;port为直接端口地址
                 IN   AL,DX ;DX的内容为端口地址(间接方式)
                 IN    AX,port;
                 IN    AX,  DX
                OUT   port,  AL
                OUT    DX,   AL
                OUT   port,  AX
                OUT    DX,   AX
                注意:①只能用累加寄存器不能用其它寄存器
                    ②当端口地址在00H—FFH之间可以用直接地址
                    当端口地址大于FFH时必须用DX间址形式
                例:IN   AL,40H;  (40H)        AL
                    IN   AX,80H;   (80H)、(81H)        AX
                    MOV    DX, 0382H    
                    IN     AL,DX     ;      (0382H)           AL
                    OUT     62H, AL
                    MOV    DX, 0380H
                    OUT     DX,AX
            ② 换码指令XLAT(查表指令)
                将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL
                XLAT    ;al←ds:[bx+al]
                换码指令执行前:
                    在主存建立一个字节量表格,内含要转换成的目的代码
                    表格首地址存放于BX,AL存放相对表格首地址的位移量
                换码指令执行后:
                    将AL寄存器的内容转换为目标代码
            ③址传送指令 三条LEA 、LDS、LES
                将存储器操作数的有效地址送至指定的16位通用寄存器
                    LEA r16, mem
                    ;r16←mem的有效地址EA
                例子:  有效地址的获取
                    LEA  AX, [2375H] ; AX=2375H
                    LEA  SP, [BX+SI] ; SP=(BX)+(SI)
                    区别:   LEA   SI, BUFF;    SI=BUFF
                            MOV   SI,BUFF;    SI=(BUFF)
                    LDS  r16, mem
                    ;ds、r16←mem中的双字,
                    执行后,会更新r16,ds的值。前面两个字节送到r16,后面两个字节送到ds
                    LES  r16, mem
                    ;es、r16←mem中的双字,执行后,会更新r16,ds的值,效果与lds类似
        3、标志传送指令    
            ①  读标志指令  
                    LAHF   ;标志寄存器低字传送到AH
            ②  设标志指令  
                   SAHF   ; AH的内容送标志寄存器低8位
            ③  标志寄存器堆栈指令
                  PUSHF ;标志寄存器内容(16位)压栈
            ④  标志寄存器出栈指令
                   POPF  ;弹出标志寄存器的内容。

                   
    二、  算术运算类指令
        概述:算术运算类指令用来执行二进制的算术运算:加减乘除以及BCD码调整。
            这类指令会根据运算结果影响状态标志,有时要利用某些标志才能得到正确的结果;使用他们时请留心有关状态标志。
            重点掌握
            加法指令:ADD、ADC、INC
            减法指令:SUB 、SBB、DEC、CMP、NEG
        1、  加法和减法指令
            加法指令:ADD, ADC和INC
            减法指令:SUB, SBB, DEC, NEG和CMP
            他们分别执行字或字节的加法和减法运算,除INC和DEC不影响CF标志外,其他按定义影响全部状态标志位
             ①不带进位加和减指令
                ADD dest,src  ;加法:dest←dest+src
                SUB dest,src  ;减法:dest←dest-src
             ② 带进位加和减指令
                 ADC dest,src
                ;加法:dest←dest+src+CF
                 SBB dest,src
                ;减法:dest←dest-src-CF
            ③ 比较指令CMP(compare)
                CMP dest,src    
                ;做减法运算:dest-src
                ;CMP指令将目的操作数减去源操作数,但差值不回送目的操作数
                比较指令通过减法运算影响状态标志,用于比较两个操作数的大小关系
                判断大小:
                    如A、B两数为无符号数,则通过以下标志判断
                    ZF=1,A=B;CF=0,A﹥B;CF=1,A ﹤B
                    如A、B两数为有符号数,不能通过CF标志判断两数的大、小关系,要使用SF、OF标志
                    ZF=1 ,A=B
                    SF、OF同号 ,则A﹥B
                    SF、OF异号 ,则A﹤B
            ④  增量和减量指令
                INC reg/mem    
                ;增量(加1):reg/mem←reg/mem+1
                DEC reg/mem    
                ;减量(减1):reg/mem←reg/mem-1
                INC指令和DEC指令是单操作数指令
                与加法和减法指令实现的加1和减1不同的是:INC和DEC不影响CF标志
            ⑤ 求补指令NEG(negtive)
                NEG reg/mem    
                        ;reg/mem←0-reg/mem
                NEG指令对操作数执行求补运算,即用零减去操作数,然后结果返回操作数
                求补运算也可以表达成:将操作数按位取反后加1
                NEG指令对标志的影响与用零作减法的SUB指令一样(总使CF=1)
                NEG指令也是一个单操作数指令
                
        2、乘法指令
            1、乘法指令规定:8位X8位,积为16位
            被乘数必须在AL中,乘积在AX中
                                        16位X16位,积为32位
            被乘数必须在AX中,乘积在DX(高16位)、AX中
            对标志位的理解:
              CF=OF=1 ,表示结果为16位或32位有效。
              CF=0,OF=1,表示只有8位或16位乘积。
            2、乘法指令分无符号和有符号乘法指令
                MUL reg/mem    ;无符号乘法
                IMUL reg/mem    ;有符号乘法
                例:IMUL   BL
                  MUL   CX
                  MUL    byte  ptr[di+04h]
                  IMUL   word  ptr[si]
        3、除法指令
            1、除法指令的规定:
                被除数是16位,必须存放于AX中,此时除数只能是8位,得到的商存于AL中,余数在AH中。
                被除数是32位,必须存放于DX、AX中,此时除数只能是16位,得到16位的商存于AX中,余数在DX中。
                除法运算后,状态标志除ZF外,无意义。
            2、当有符号数相除,商超出表示范围不表示为溢出,其与除数为0一样,产生0号中断。(除法出错)。
                有符号数相除,会有两种结果,选择余数的符号与被除数相同。
                (-30)÷8= -4余+2或-3余-6 取后者
                当被除数只有8位或16位时必须进行扩展。
            3、除法指令分无符号和有符号除法指令
                DIV reg/mem    ;无符号除法
                IDIV reg/mem    ;有符号除法
                例: DIV  CL;
                     IDIV   BL;
                     DIV   word ptr[bx];
                     IDIV   byte ptr[2300h]
        4、符号扩展指令
            无符号数的扩展高位补0,有符号数扩展使用符号扩展指令。
            符号扩展是指用一个操作数的符号位(最高位)形成另一个操作数,即扩展符号位。
            符号扩展虽然使数据位数加长,但数据大小并没有改变,扩展的高位部分仅是低位的符号扩展。
            符号扩展指令有两条,用来将字节转换为字,字转换为双字
                CBW    ;AL符号扩展成AX
                CWD    ;AX符号扩展成DX
            例子:mov al,64h    
                    ;AL=64H (机器数) ,表示10进制数100(真值)
                 cbw    
                    ;将符号0扩展,AX=0064H,仍然表示100
                 mov ax,0ff00h        
                        ;AX=FF00H,表示有符号10进制数-256
                 cwd    ;将符号位“1”扩展,DX.AX=FFFFFF00H
                        ;仍然表示-256
        5、十进制调整指令
            十进制数调整指令对BCD运算的结果进行十进制调整,以得到正确的十进制的运算结果。
            BCD码的运算只有字节运算,且必须用AL作目的操作数。
            8088指令系统支持两种BCD码调整运算
            压缩BCD码就是通常的8421码;它用4个二进制位表示一个十进制位,一个字节可以表示两个十进制位,即00~99
            非压缩BCD码用8个二进制位表示一个十进制位,只用低4个二进制位表示一个十进制位0~9,高4位任意,通常默认为0
            ① 加法调整指令
                非压缩BCD码相加后用    AAA 调整
                压缩BCD码相加后用    DAA 调整
                例1:设AL=09H  CL=07H
                      ADD     AL,CL;   AL=10H
                      AAA                  ;
                     结果:  AH=01H   AL= 06H
                   调整的方法:当(AL)﹥9或AF=1
                 (AL)+06H        AL ,然后(AL)∧ 0FH;
                 (AH)+1        AH
                   调整后AF、CF 置1,其他标志无意义。   
                例2:设AL=28H    CL=53H
                  ADD     AL,CL;   AL=7BH
                  DAA                  ;
                 结果:  AL=81H
                调整的方法:当AL中低4位﹥9
                (AL)+06H        AL 。
                调整指令影响AF、CF、PF、SF、ZF,OF无意义。
            ② 减法调整指令
                非压缩BCD码相减以后用     AAS调整
                压缩BCD码相减以后用       DAS调整
                AAS指令的方法与AAA相似:
                   当(AL)﹥9或AF=1(半借位)
                 (AL)-06H        AL ,然后(AL)∧ 0FH;
                 (AH)-1        AH
                DAS指令的方法与DAA相似(加变减)。
            ③ 乘法调整指令
                BCD码相乘只能用非压缩BCD码,因而只有一条调整指令即    AAM
                调整方法(AL)除以0AH,得到的商送到AH,
                    余数在AL中。
                  例:AL=05H,  CL=07H
                         MUL    CL ;AL=23H
                         AAM         ; AH=03H    AL=05H
            ④ 除法调整指令
                除法也只有非压缩BCD码相除,用AAD调整。
                除法调整指令用于除法指令之前。
                调整的方法是将AX中的2位被除数调整好,再除以除数:
                (AH)X(0AH)+(AL)        AL
                  例:AX=0402H      CL=06H
                        AAD         ;AL=2AH
                        DIV    CL  ;AL=07H


    三、逻辑运算和移位指令                 
        逻辑运算即位操作,指令以二进制位为基本单位进行数据的操作
        当需要对字节或字数据中的各个二进制位操作时,可以考虑采用位操作类指令
        注意这些指令对标志位的影响
        1. 逻辑运算指令
        AND  OR  XOR  NOT   TEST
        2. 移位指令
        SHL(SAL) SHR  SAR
        3. 循环移位指令
        ROL  ROR  RCL  RCR
        1、逻辑运算指令
            双操作数逻辑指令AND、OR、XOR和TEST设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义;它们的操作数组
            合与ADD、SUB等一样:
            运算指令助记符  reg, imm/reg/mem
            运算指令助记符  mem, imm/reg
            单操作数逻辑指令NOT不影响标志位,操作数与INC、DEC和NEG一样:
            NOT reg/mem
            1、逻辑与指令AND
                AND dest,src    ;dest←dest∧src   对两个操作数执行逻辑与运算,结果送目的操作数
            2、逻辑或指令OR
                OR dest,src    ;dest←dest∨src  对两个操作数执行逻辑或运算,结果送目的操作数
            3、逻辑异或指令XOR
                XOR dest,src    ;dest←dest⊕src   对两个操作数执行逻辑异或运算,结果送目的操作数
            4、测试指令TEST
                TEST dest,src    ;dest∧src   对两个操作数执行逻辑与运算,结果并不送目的操作数,仅按AND指令影响标志
                AND与TEST指令的关系,同SUB与CMP指令的关系一样
            5、逻辑非指令NOT
                NOT reg/mem    ;reg/mem←~reg/mem   对一个操作数执行逻辑非运算
        2、移位指令
            将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作
            移位指令的第一个操作数是指定的被移位的操作数,可以是寄存器或存储单元;后一个操作数表示移位位数:
            该操作数为1,表示移动一位
            该操作数为CL,CL寄存器值表示移位位数 (移位位数大于1只能CL表示)
            按照移入的位设置进位标志CF,根据移位后的结果影响SF、ZF、PF
            1、逻辑左移指令SHL,逻辑右移指令SHR
                SHL reg/mem,1/CL
                ;reg/mem左移1或CL位
                ;最低位补0,最高位进入CF
                SHR reg/mem,1/CL
                ;reg/mem右移1/CL位
                ;最高位补0,最低位进入CF
            2、算术左移指令SAL,算术右移指令SAR
                SAL reg/mem,1/CL    
                ;与SHL是同一条指令
                SAR reg/mem,1/CL
                ;reg/mem右移1/CL位
                ;最高位不变,最低位进入CF
            3、循环移位指令
                循环移位指令类似移位指令,但要将从一端移出的位返回到另一端形成循环。分为:
                ROL reg/mem,1/CL    ;不带进位循环左移
                ROR reg/mem,1/CL    ;不带进位循环右移
                RCL reg/mem,1/CL    ;带进位循环左移
                RCR reg/mem,1/CL    ;带进位循环右移
                循环移位指令的操作数形式与移位指令相同,按指令功能设置进位标志CF,但不影响SF、ZF、PF、AF标志

    四、控制转移类指令
        控制转移类指令用于实现分支、循环、过程等程序结构,是仅次于传送指令的常用指令
        控制转移类指令通过改变IP(和CS)值,实现程序执行顺序的改变
        重点掌握:
         JMP/Jcc/LOOP/JCXZ  
        CALL/RET
        1、目标地址的寻址方式
            相对寻址方式,直接寻址方式,都是用标号表达
            间接寻址方式  用寄存器或存储器操作数表达
        2、无条件转移指令
            JMP label    ;程序转向label标号指定的地址
            只要执行无条件转移指令JMP,就使程序转到指定的目标地址,从目标地址处开始执行指令
            操作数label是要转移到的目标地址(目的地址、转移地址)
        3、 条件转移指令
            条件转移指令Jcc根据指定的条件确定程序是否发生转移。其通用格式为:
            Jcc  label    ;条件满足,发生转移
                        ;IP←IP+8位位移量;
                        ;否则,顺序执行
            label是一个标号、一个8位位移量,表示Jcc指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移
            label只支持短转移的相对寻址方式
            ① Jcc指令的分类
                Jcc指令不影响标志,但要利用标志。
                根据利用的标志位不同,分成三种情况:
                ⑴  判断单个标志位状态
                ⑵  比较无符号数高低
                ⑶  比较有符号数大小
            ② 判断单个标志位状态
                ⑴ JZ/JE和JNZ/JNE
                    利用零标志ZF,判断结果是否为零(或相等)
                ⑵ JS和JNS
                    利用符号标志SF,判断结果是正是负
                ⑶ JO和JNO
                    利用溢出标志OF,判断结果是否产生溢出
                ⑷ JP/JPE和JNP/JPO
                    利用奇偶标志PF,判断结果中“1”的个数是偶是奇
                ⑸ JC/JB/JNAE和JNC/JNB/JAE
                    利用进位标志CF,判断结果是否进位或借位
            ③ 比较数的大小
            比较无符号数高低
                无符号数的大小用高(Above)、低(Below)表示,需要利用CF确定高低、利用ZF标志确定相等(Equal)
                两数的高低分成4种关系,对应4条指令
                JB(JNAE):目的操作数低于(不高于等于)源操作数
                JNB(JAE):目的操作数不低于(高于等于)源操作数
                JBE(JNA):目的操作数低于等于(不高于)源操作数
                JNBE(JA):目的操作数不低于等于(高于)源操作数
            比较有符号数大小
                判断有符号数的大(Greater)、小(Less),需要组合OF、SF标志、并利用ZF标志确定相等与否
                两数的大小分成4种关系,分别对应4条指令
                JL(JNGE):目的操作数小于(不大于等于)源操作数
                JNL(JGE):目的操作数不小于(大于等于)源操作数
                JLE(JNG):目的操作数小于等于(不大于)源操作数
                JNLE(JG):目的操作数不小于等于(大于)源操作数
        4、 循环指令
            一段代码序列多次重复执行就是循环
            8088设计有针对CX计数器的计数循环指令
                LOOP label    ;循环指令  dec cx    jnz label
                    ;首先CX←CX-1;然后判断;若CX≠0,转移
                JCXZ label    ;为0循环指令
                    :如果CX=0,则转移
            label操作数采用相对短寻址方式
            还有LOOPZ/LOOPE和LOOPNZ/LOOPNE两条指令
            
    五、串操作指令
        串指令可以对字节或字串进行操作。
        所有串操作指令都默认对DS段中用SI指定的源操作数及ES段中用DI指定的目的操作数寻址,可用段超越前缀改变。
        串操作指令执行时,由标志位DF决定地址指针的修改方向。当DF=1时作减量修改;当DF=0时作增量修改。因此,在串操作指
        令执行前,需对SI、DI和DF进行设置。
        使用串操作指令一般要加重复前缀。
        每一条指令即是一段循环程序,可以被中断。
        串操作指令是唯一的一类源操作数和目的操作数都为存储器单元的指令。
        1、字符串传送指令
            串传送指令  MOVSB/MOVSW
            其功能是把位于DS段由SI指定的内存单元的字节数据或字数据传送到ES段由DI指定的内存单元。指令不影响状态标志位。
            例:把DS段1000H起始的100个字节的内容传送到ES段2000H起始的内存中。
               MOV   SI,1000H
               MOV   DI,2000H
               MOV   CX,100
               CLD                     ;DF=0
               REP   MOVSB     ;(SI)      (DI)
                                               SI+1          SI
                                               DI+1          DI
                                               CX-1≠0,继续传送
        2、字符串比较指令
            串比较指令  CMPSB/CMPSW
            其功能是比较DS和ES段中相对应的内容,可以通过重复前缀指明比较两段是否完全相同或不同,找出第一个相等或不相等的字符。
            重复前缀:
            相同重复:    REPZ
            不相同重复:REPNZ
            例:MOV   SI,2050H
            MOV   DI,3000H
            MOV   CX,20
            CLD
            REPZ   CMPSB ;
            JNZ      NEQ;           
             ..                   
             ..                              
        NEQ:        (SI)与(DI)相比,如ZF=1继续比较。(SI)+1、(DI)+1,(CX)-1,当CX=0或ZF=0时,停止比较。(CX=0不影响ZF)

        3、字符串搜索指令  SCAS
            串搜索指令  SCASB/ SCASW
            其功能是把AL或AX中的内容与ES段由DI指定的一个字节数据或字数据进行比较,寻找与AL或AX内容相等或不相等的数据。
        例:MOV   DI,2000H
           MOV   AL,FFH
           MOV   CX,1000H
           CLD
           REPNZ   SCASB ;
           JZ      EXC;                             
             ..  AL与(DI)相比,如ZF=0继续比较。 (DI)+1,(CX)-1,当CX=0或ZF=1时,停止比较。(CX=0不影响ZF)                            
            EXC:
        4、取字符串指令
            取字符串指令  LODSB/LODSW
            其功能是把位于DS段由SI指定内存单元的内容取到寄存器AL或AX中。指令不影响状态标志位。一般不用重复前缀,可自动改变
            地址。
        5、存字符串指令
            存字符串指令  STOSB/STOSW
            其功能是把寄存器AL或AX中的内容存到ES段由DI指定的内存单元。指令不影响状态标志位。可用重复前缀。
            例:  MOV   DI,2300H
                 CLD
                 MOV    CX,100H
                 XOR     AX,AX
                 REP      STOSW
                
    六、  子程序指令
        子程序是完成特定功能的一段程序
        当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行
        当运行完子程序功能后,采用RET返回指令回到主程序继续执行
        注意:转移指令有去无回,子程序调用需要返回,其中利用堆栈保存返回地址
        1. 子程序调用指令CALL
            CALL指令分成4种类型(类似JMP)
            CALL label        ;段内调用、直接寻址
            CALL r16/m16    ;段内调用、间接寻址
            CALL far ptr label    ;段间调用、直接寻址
            CALL far ptr mem    ;段间调用、间接寻址
            CALL指令需要保存返回地址:
            段内调用——入栈偏移地址IP
            SP←SP-2,SS:[SP]←IP
            段间调用——入栈偏移地址IP和段地址CS
            SP←SP-2,SS:[SP]←CS
            SP←SP-2,SS:[SP]←IP
        2. 子程序返回指令RET
            根据段内和段间、有无参数,分成4种类型
            RET        ;无参数段内返回
            RET i16        ;有参数段内返回
            RET        ;无参数段间返回
            RET i16        ;有参数段间返回
            需要弹出CALL指令压入堆栈的返回地址
            段内返回——出栈偏移地址IP
            IP←SS:[SP], SP←SP+2
            段间返回——出栈偏移地址IP和段地址CS
            IP←SS:[SP],SP←SP+2
            CS←SS:[SP],SP←SP+2
        3、 中断指令和系统功能调用
            中断(Interrupt)是又一种改变程序执行顺序的方法
            中断指令有3条:
            INT i8        IRET        INTO
            本节主要掌握类似子程序调用指令的中断调用指令INT i8,进而掌握系统功能调用
    七、 处理器控制类指令
        处理器控制类指令用来控制CPU的状态,使CPU暂停、等待或空操作等
        NOP    ;空操作指令,等同于“xchg ax,ax”指令
        SEG:    ;段超越前缀指令:CS:,SS:,DS:,ES:
        HLT    ;暂停指令:CPU进入暂停状态
        还有其他指令:
            LOCK    ESC    WAIT
            STC ;CF=1
            STD ;DF=1
            STI   ;IF=1
            CLC ;CF=0
            CLD ;DF=0
            CLI   ;IF=0
            CMC ;CF取反
            
    总结:
    希望大家就如下几个方面进行一下总结:
    操作数寻址方式和目的地址寻址方式
    指令支持的操作数形式
    常用指令的助记符和功能
    指令对标志的影响

  • 相关阅读:
    SQL Server 2008 PREEMPTIVE_OS_GETPROCADDRESS 等待类型
    数据库使用 jemalloc 内存优化算法
    my.cnf 推荐配置
    WIN 命令合成一个大内存的图片怎么搞
    jupyter notebook加载DDP预训练模型
    model.add_module
    einsum爱因斯坦求和
    skimage.measure.label
    easyocr下载模型失败
    测试面试题 05
  • 原文地址:https://www.cnblogs.com/sduycq/p/4880999.html
Copyright © 2020-2023  润新知