
xor eax, eax
1 ^ 2 = 3
3 ^ 2 = 1
1 ^ 1 = 0
mov eax, 0ret 改变 eip 寄存器的值, mov eip, [esp] add esp,4
eip: 当前程序代码运行的位置 永远指向
`写代码时
调用函数 一般有三个规则
参数传递的不同样
push xx 到堆栈中
前几个参数放到寄存器中,这样可以加快调用, fastcall平栈 方式不通
内平栈 ret xxx
外平栈 ret结束之后, add esp,xxx_cdecl
call xxx
add esp,xxx
sub 等价 cmp
但 sub 会产生实际的减法效果。
cmp 只会影响 eflags 寄存器
jge
根据 eflags 寄存器来 判断是否需要进行跳转。
jcc 指令
for()
for 循环的 伪代码表现形式
初始化代码:
i = 0;jmp 比较代码
累加的代码:
i++;
比较代码:
i < 50;
jcc 比较时,会反过来比较。 因为汇编中若满足条件则直接跳出循环。 而在c语言中,若满足条件,则继续执行。故相反。
jcc 结束循环
执行 for 循环体:
jmp 累加的代码
结束循环:
do {
// 循环体
} while (exp);
循环开始:
循环体代码:
jcc 循环开始
while(exp)
{
}
循环开始:
比较 与for循环一样,判断条件在汇编中与c语言是反过来的。
jcc 循环结束
循环体代码
jmp 循环开始
循环结束
if()
{
if 代码
}
else if(xx)
{
else if 代码
}
else{
else 代码
}
if elseif else 伪代码形式
jcc elseiflab
jcc elseiflab
if代码
jmp 判断结束
elseiflab:
jcc elselab
elseif 代码
jmp 判断结束
elselab:
else代码
switch 优化
多个 case 标签 并且连续 小表,根据表来进行快速跳转。
`
评论 (0)