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寄存器