汇编常用指令

时间:2025-03-26 10:15:27

reg :表示寄存器

men: 表示内存

imm: 表示立即数

seg:  表示段

 

MOV指令:

    语法 :  MOV reg,reg/men/imm

               MOV mem,reg/imm

               MOV seg,reg16/mem16

     指令操作: 相当于将操作数1中的值,给操作数2

    例:     MOV  EAX,100   此时EAX寄存器中就会保存0x100

              {  MOV  EAX,100      

                 MOV  ECX,EAX  }    此时先将EAX赋值100,然后给ECX赋上EAX所保存的值。 此时ECX的值为100

 

 

PUSH 指令:

       语法:

            PUSH reg/mem/seg 

       指令操作:向栈中压入数据,并且改变ESP的位置

例:     PUSH  0x100    此时将0x100压入栈中

            PUSH  EAX       此时将EAX中的值压入栈中

            PUSH  AX          此时将AX中的值压入栈中

 注意:将数据压入栈中时,会改变栈的栈顶(ESP)位置。位置变化多少是根据压入数据的类型所占的空间大小

           例如:PUTH 0x100  数值所占的空间大小为4个字节,所以ESP的值就会减少4

                      PUTH EAX     因为EAX所占的空间大小为4个字节,所以ESP的值会减少4

                      PUSH AX       因为AX所占的空间大小为2个字节,所以ESP的值会减少2

 

POP  指令

        语法:

                POP reg/mem/seg

       操作: 将栈中的数据从栈中弹出,并将栈中的数据保存到操作数中,并且改变ESP的位置

        例: POP EAX  将栈中的数据进行弹出,并将数据保存到EAX中

                POP CX  将栈中的数据进行弹出,并将数据保存到CX中

        注意: 将栈中的数据从栈中弹出时,会改变栈的栈顶(ESP)位置,位置变化多少是根据弹出数据的类型所占的空间大小

                    POP EAX  EAX的数据类型大小占4个字节空间,所以ESP的值要增加4

                    POP  AX    AX的数据类型大小占2个字节空间,所以ESpo的值要增加2

 

XCHG  指令

            语法:

                XCHG  reg,reg/mem

                XCHG  mem,reg

            操作: 将目标操作数与源操作数的内容相交换    

            XCHG  EAX,DWORD PTR[1000]   将EAX中的值与内存1000中的4个字节的值互换

            注意:使用内存是需要声明内存的空间大小

 

LEA   指令 

          语法:

                LEA reg,mem

          操作:将内存地址传到寄存器中

          例:

                LEA EAX,DWORD PTR[100]    将100给EAX保存

PUSHF/POPF 指令

        语法:

                PUSHF/

                POPF

        操作:将标志寄存器的内容压入/弹出栈(没有操作数,就是讲EFL的值存入到栈中)

        例: PUSHF 或 POPF

PUSHA/POPA  指令

        语法:

                PUSHA/

                POPA

        操作:将所有寄存器状态压入、弹出堆栈(仅限16位寄存器,32位寄存器为PUSHAD/POPAD,将所有的寄存器值存入栈中,ESP的每次都会变动,EIP的值不会保存)

        例:

                PUSHA   压入所有16位寄存器到栈中

                PUSHAD 压入所有32位寄存器到栈中

                POPA    弹出栈中所有的16寄存器

                POPAD  弹出栈中所有的32寄存器

 

 ADD指令

            语法:

                    ADD reg,reg/mem/imm

                    ADD mem,imm/reg

            操作:将两个操作数进行相加,然后保存到操作数1中。

       例子:

            ADD EAX,100  假设EAX的值为1,那么该代码结果为11,并且11会保存在EAX中

ADC指令

            语法:

                    ADC reg,reg/mem/imm

                    ADC mem,reg/imm

            操作:将目标数据和源数据以及进位(CF)标志相加,并将结果保存在目标操作数据中

                    ADC reg,1     假设reg的值为0xFFFFFFFF, 那么该代码为0XFFFFFFFF+1,此时发生进位,所以需要将结果再加1.最终结果为1(验证时不准确)

                    ADC reg,1     假设reg的值为0xFFFFFFFF,那么该代码为0XFFFFFFFF+1+原本的CF,

                                            如果此时CF为0,那么结果就为0,如果此时CF是1,那么结果为1

 

INC 指令

            语法:

                    INC  reg/mem

            操作:将目标操作数加1,并且(进位标志寄存器的值)CF标志的状态不会改变                   INC  EAX    假设EAX的值为0XFFFFFFFF,CF=0,那么结果为0X00000000,CF = 0
                   INC  EAX    假设EAX的值为0XFFFFFFFF,CF=1,那么结果为0X00000000,CF = 1

SUB 指令    

           语法:

                SUB reg,reg/mem/imm

                SUB mem,reg/imm

            操作:将目标操作数与源操作数相减,并将结果保存到目标操作数

                SUB EAX,ECX 假设EAX的值为0x10,ECX的值为0x2,那么结果为0xE,并将0xE存到EAX

SBB 指令

        语法:

                SBB reg,reg/mem/imm

                SBB mem,reg/imm

            操作:将源操作数与进位(CF)标志相加,再用目标操作数减去此结果,将最终结果保存到目标操作数中

            例:

                    SBB  EAX,ECX      假设EAX = 2,ECX = 1,CF=1,那么结果为0,因为EAX-ECX-CF =0。最后将结果保存到EAX中

                    SBB EAX,ECX       假设EAX = 2,ECX = 1,CF = 0,那么结果为1,因为EAX-ECX-CF =1,最后将结果保存到EAX中

DEC  指令

        语法:

                DEC  reg/mem

                操作 :将目标操作数减一,同时保持CF标志的状态不变

        例:
                DEC EAX   假设EAX = 0,CF = 0,那么最终结果为 EAX = 0xFFFFFFFF,CF = 0
                DEC EAX   假设EAX = 0,CF = 1,那么最终结果为 EAX = 0xFFFFFFFF,CF = 1

MUL 指令

        语法:

                MUL reg/mem

               操作:将目标操作数与源操作数执行无符号乘法,并将结果保存到目标操作数中。目标操作数是位于AL,AX,EAX寄存器中(取决操作数的大小)的隐式操作数。源操作数位于通用寄存器或内存位置。

               例:     MUL  ECX     假设EAX=5,ECX= 3,那么结果为F

IMUL 指令

        语法    

                IMUL  reg/mem                    :单操作数

                IMUL reg,reg/mem/imm       :双操作数

                IMUL reg,reg/mem,imm       :三操作数

        操作:    

                单操作数:该形式与MUL的指令使用形式完全相同,源操作数(位于通用寄存器或内存位置)乘以AL,AX,EAX寄存器中(取决于操作数大小)中的值,乘积分别存到AX,DX:AX或EDX:EAX寄存器中。(如果乘积能够被EAX保存,那么乘积就会保存在EAX中。如果EAX无法全部存下,那么无法保存的高位数值会被保存到EDX中)

                双操作数:此种形式是目标操作数乘以源操作数,目标操作数是通用寄存器,源操作数可以是立即数,通用寄存器或内存位置,乘积随后存储在到目标操作数位置(如果乘积超出去那么会导致溢出)

                三操作数:此种形式需要一个目标操作数与两个源操作数,第一个源操作数(可以是通用寄存器或内存位置)乘以第二个源操作数(立即数),乘积随后储存到目标操作数(通用寄存器中)。

                                (如果乘积能够被目标操作数保存,那么乘积就会保存在目标操作数中。如果目标操作数无法全部存下,那么会导致溢出)

        例:    IMUL EBX               ;如果EAX= 2,EBX= 2,结果EAX= 4

                   IMUL EAX, EBX      ;如果EAX= 2,EBX= 2,结果EAX= 4

                   IMUL EAX, EBX,2   ;如果EAX= 2,EBX= 3,结果EAX= 6

    DIV  指令

        语法 DIV reg/mem

        操作 将AX、AD:AX 或EDX:EAX中的值(被除数)除以(无符号)源操作数(除数),结果存储到AX(AH:AL)、DX:AX或EDX:EAX寄存器

        (如果,源操作数大于AX或EAX中的值,那么会直接导致停止。

            如果相除的结果AX或EAX无法保存下来,那么才会保存到EDX中或DX:AX中

            如果EDX中存在数值此时相除时也会导致停止

            导致停止的原因是,内部的除法错中断机制)

            例:

                     DIV ECX ;假设EAX = 10,ECX= 2,EDX= 0,那么EAX中的值为5

    

    IDIV指令

            语法:reg/mem

            操作   将AX、AD:AX 或EDX:EAX中的值(被除数)除以(有符号)源操作数(除数),结果存储到AX(AH:AL)、DX:AX或EDX:EAX寄存器