最基础的汇编指令
常用的汇编指令
指令 | 示例 | 含义 | 说明 |
---|---|---|---|
Mov | Mov EAX,ECX | EAX=ECX | 将ECX的值存入EAX |
ADD | ADD EAX,ECX | EAX+=ECX | 将EAX的值加上ECX的值 |
SUB | SUB EAX,ECX | EAX-=ECX | 将EAX的值减去ECX的值 |
INC | INC EAX | EAX++ | 将EAX的值加1 |
DEC | DEC EAX | EAX– | 将EAX的值减1 |
LEA | LEA EAX,[ECX+4] | EAX=ECX+4 | 将ECX+4的值出去EAX |
CMP | CMP EAX,ECX | if(EAX==ECX) ZF=1 else ZF=0 | 对两个值进行比较根据比较的结果设置标志位 若EAX于ECX相同,ZF=1 若EAX于ECX不相同,ZF=0 |
TEST | TEST EAX,EAX | if(EAX==0) ZF=1 else ZF=0 | 将值与0比较根据比较结果设置标志位 若EAX等于0,ZF=1 若EAX不等于0,则ZF=0 |
JE(JZ) | JE 04001000 | if(ZF==1) GOTO 04001000 | 若ZF=1,则跳转到04001000 |
JNE(JNZ) | JNE 04001000 | if(ZF==0) GOTO 04001000 | 若ZF=0,则跳转到04001000 |
JMP | JMP 04001000 | GOTO 04001000 | 无条件跳转到04001000 |
CALL | CALL lstrcmpW | 调用lstrcmpW | |
PUSH | PUSH 00000001 | 压栈 | |
POP | POP EAX | 出栈并将获取的值存入EAX寄存器 |
Notice:
只要看到带有两个相同寄存器的test指令,一般就是条件分支,可以简单的理解成若寄存器值为0,则ZF=1;
将JNZ和TEST指令结合起来就是:
test eax,eax
jnz 04001000
- 若EAX值为0,则跳转
- 若EAX值为1,不跳转
call指令是用来调用子程序,返回值一般存放在EAX寄存器中。
子程序的参数一般存放在栈中,用push指令压入。参数是从后往前的顺序压入。
学习编写汇编码我之前有写过专门的博文来讲解具体的操作和用到工具。
参见:http://blog.csdn.net/chengyu779394084/article/details/50325993