最近,为了深入学习学C++的语法,不知不觉又涉及到反汇编的范畴里,和大家一起分享反汇编的学习。
PS:最近真是郁闷,本来想着学directX,然后又觉得应该先扎实GDI;学着GDI,又得先熟悉C++的面向对象;要精通C++语法的内部原理,又得学会看反汇编。结果到反汇编来了...
部分知识参照上篇的 《图解“{”》
这次来学习if语句反汇编之后的内容,首先来个源码:
if(a>50 && a<100) //其中a为第一个局部变量
{
printf("The number is %d/n",a);
}
else if(a<=50)
{
printf("Too small!/n");
}
else
{
printf("Too large!/n");
}
Od反汇编后:
1.CMP DWORD PTR SS:[EBP-4],32;a和50(32h)比较 SS:[EBP-4]为什么是a,不明看《图解“{”》
2.JLE SHORT Console.00401085;不大于则跳到11行 (else部分)
3.CMP DWORD PTR SS:[EBP-4],64;a和100(64h)比较
4.JGE SHORT Console.00401085;不小于则跳到11行(else部分)
5.MOV ECX,DWORD PTR SS:[EBP-4];将a送到ecx寄存器
6.PUSH ECX;讲ecx(a的值)压栈,作为printf的右一参数
7.PUSH OFFSET Console.??_C@_0BC@MJDO@The?5numbe>
; 将静态变量区的 “the number is %d/n”字符串压栈作为右二参数
8.CALL Console.printf; 调用printf函数
9.ADD ESP,8;恢复调用前的栈(即将从栈中去掉之前两个参数,2*4字节)
10.JMP SHORT Console.004010A7 ;if语句执行后,跳到20行(退出整个if语句)
11.CMP DWORD PTR SS:[EBP-4],32 ;a和50(32h)对比
12.JG SHORT Console.0040109A;大于则跳到17行 (第二个else部分)
13.PUSH OFFSET Console.??_C@_0M@JFPO@Too?5small?>; “too small!/n”
14.CALL Console.printf; 调用printf函数
15.ADD ESP,4; 恢复函数调用前的栈
16.JMP SHORT Console.004010A7;跳到20行(退出整个if语句)
17.PUSH OFFSET Console.??_C@_0M@FPJP@Too?5large?>; “too large!/n”
18.CALL Console.printf; /printf
19.ADD ESP,4; 恢复函数调用前的栈
20.之后的语句…