EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP, 它 们 的低 16 位就是 8086 的
AX,BX,CX,DX,SI,DI,SP,BP,它们的含义如下:
EAX:累加器
EBX:基址寄存器(Base)
ECX:计数器
EDX:数据寄存器(Data)
ESI:源地址指针寄存器(Source)
EDI:目的地址指针寄存器(Directy)
EBP:基址指针寄存器(Base)
ESP:堆栈指针寄存器(Stack)
32位系统前面多了‘E’,16位系统没有‘E’。
AX的高8位AH,低8位AL
DX的高8位DH,低8位DL
2.PUSHF及POPF
PUSHF压入标志寄存器,POPF弹出并存入标志寄存器
PUSHA及POPA
PUSHA压入所有一般用途寄存器,POPA弹出并存入所有一般用途寄存器
PUSHAD及POPAD
PUSHAD压入所有扩展寄存器,POPAD弹出并存入所有扩展寄存器
3.MOV AX,[1234h] 表示将0x1234地址处的内容存入AX寄存器
MOV [1234h],WORD 2*33 将2*33存入内存0x1234地址处
MOV AX, IP 错误,不能使用寄存器IP当目的操作数或源操作数,因为IP所存的数据是下一个指令的地址,不能改变它的值。
LEA AX, total 将total的偏移地址传送到AX
4.PUSH AX 压入16位的寄存器AX
PUSH EAX 压入32位的寄存器EAX
PUSH WORD [total] 压入16位的内存total内容
PUSH DWORD [total] 压入32位的内存total内容
PUSH BYTE 12 压入8位的立即数12
PUSH WORD 1234H 压入16位的立即数1234H
PUSH DWORD 12345678H 压入32位的立即数12345678H
5.INT 8位立即数 INT指令执行软件中断
依标志及CX的条件转移指令表:
JZ 当ZF=1时转移
JNZ 当ZF=0时转移
JS 当SF=1时转移
JNS 当SF=0时转移
JO 当OF=1时转移
JNO 当OF=0时转移
JC 当CF=1时转移
JNC 当CF=0时转移
JP(JPE) 当PF=1时转移
JNP(JPO) 当PF=0时转移
JCXZ 当CX=0时转移
6.CMP命令:
CMP AX, BX 寄存器AX与寄存器BX比较
CMP AX, [total] 寄存器AX与变量total比较
CMP AX, 0 寄存器AX与立即数0比较
CMp [total], DX 变量total与寄存器DX比较
CMP [total], 0 变量total与立即数0比较
有符号整数比较的条件转移指令表:
JL(JNGE) 小于时转移
JG(JNLE) 大于时转移
JLE(JNG) 小于或等于时转移
JGE(JNL) 大于或等于时转移
JE 等于时转移
JNE 不等于时转移
无符号整数比较的条件转移指令表:
JB(JNAE) 低于时转移
JA(JNBE) 高于时转移
JBE(JNA) 低于或等于时转移
JAE(JNB) 高于或等于时转移
JE 等于时转移
JNE 不等于时转移
7.无条件转移指令JMP
JMP label
JMP SHORT label
跳至指定地址开始执行程序
循环指令loop:
Label:
;需要循环执行的指令
LOOP label
8.
Label:
DEC CX
JG label
将CX的值减去1,如果CX的值大于0,则跳转到label执行
9.
加减法:
ADD 第一操作数,第二操作数 加法
SUB 第一操作数, 第二操作数 减法
ADD AL, BYTE[b] 将变量b的内容加入寄存器AL
SUB AL, BYTE[b] 将寄存器AL减去变量b的值
DEC 操作数 对操作数减一
INC 操作数 对操作数加一
乘法:
MUL 操作数 MUL针对无符号整数的相乘
IMUL操作数 IMUL针对带符号整数的相乘
8位操作数的值与AL相乘后其乘积存入AX中。
16位操作数的值与AX相乘后其乘积存入DX:AX中。
32位操作数的值与EAX相乘后其乘积存入EDX:EAX中。
除法:
DIV 操作数
IDIV操作数
AX的值除以8位操作数的值,其商存在AL上,其余数存于AH中。
DX:AX的值除以16位操作数的值,其商存于AX中,其余数存于DX中。
EDX:EAX的值除以32位操作数的值,其商存于EAX,其余数存于EDX中。
10. 每次cpu执行都要先读取eip寄存器的值,然后定位eip指向的内存地址,并且读取汇编指令,最后执行。执行后 eip的值=后面要跳转的地址。
11. 汇编过程参数传递的方式:寄存器,变量,堆栈,利用call后续区四种方式传参。
test eax, eax
je 00401083
test指令操作是目的操作数和源操作数按位逻辑“与“
运算结果不送回目的操作数
然后根据结果设置SF、ZF、和PF标志位,并将CF和OF
标志位清零。
而JE是当ZF=1时跳转。
即,当eax的值等于0时跳转。
因此说,这里的test就是检测eax的值是不是0
12. xor eax,eax和mov eax,0两者的作用没有区别,都是让eax的值为0,但是xor eax,eax 指令为2字节,mov eax,0 指令为5个字节。相比而言,前面指令更能节省空间。
xor eax,eax是让eax与eax进行异或操作。
13.汇编过程末尾ret 4*n的含义:先执行ret,将堆栈顶函数返回地址取出存入eip,执行函数返回操作,然后将过程的n个参数弹出堆栈,esp=esp+4*n,堆栈指针恢复到调用call之前的状态。
14.位运算:
AND 第一操作数,第二操作数
OR 第一操作数,第二操作数
XOR 第一操作数,第二操作数
NOT 操作数
TEST第一操作数,第二操作数
TEST指令检查第一操作数,看看某个指定的位是否被打开。Test的结果不会改变任何操作数的值,与and的操作结果相同,只是没有将结果存回第一操作数而已。
15.改变位位置:
SHL 左移
SHR 右移
SAL 算术左移
SAR 算术右移
ROL 循环左移
ROR 循环右移
RCL 带进位循环左移
RCR 带进位循环右移