int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
void myfunction(int a,int b)
{
int c = a + b;
}
(本人用的是 VS2008 测试.)
在 return 0 处.
int c = a + b 处 设置2个断点.
然后进入调试,窗口,反汇编.得到以下代码:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
00CF1370 push ebp
00CF1371 mov ebp,esp ;把esp,移动至 ebp地址
00CF1373 sub esp,0C0h
00CF1379 push ebx ;保存3个寄存器 :ebx,esi,edi
00CF137A push esi
00CF137B push edi
00CF137C lea edi,[ebp-0C0h];把ebp-0c0h地址内容移动到edi中
00CF1382 mov ecx,30h
00CF1387 mov eax,0CCCCCCCCh ;0cccccccch c语言初始化地址
00CF138C rep stos dword ptr es:[edi] ;串写入
return 0;
00CF138E xor eax,eax
}
00CF1390 pop edi 恢复 3个寄存器 edi,esi,ebx
00CF1391 pop esi
00CF1392 pop ebx
00CF1393 mov esp,ebp
00CF1395 pop ebp
00CF1396 ret
void myfunction(int a,int b)
{
00CF14A0 push ebp ;保存ebp,并把esp放入ebp中.此时ebp与esp
00CF14A1 mov ebp,esp ;同都是这次函数调用的栈顶.
00CF14A3 sub esp,0CCh 把esp往上移动一个范围,等于在堆栈中放出一片新的空间用来存储局部变量
00CF14A9 push ebx ;保存3个寄存器
00CF14AA push esi
00CF14AB push edi
00CF14AC lea edi,[ebp-0CCh]
00CF14B2 mov ecx,33h
00CF14B7 mov eax,0CCCCCCCCh
00CF14BC rep stos dword ptr es:[edi]
int c = a + b;
00CF14BE mov eax,dword ptr [a] ;把a的值放入eax这个寄存器中(把a压入堆栈)
00CF14C1 add eax,dword ptr ;把b的值加到eax这个寄存器中(把b压入堆栈)
00CF14C4 mov dword ptr [c],eax ;把寄存器中a + b的值移动至c.
}
00CF14C7 pop edi
00CF14C8 pop esi
00CF14C9 pop ebx
00CF14CA mov esp,ebp
00CF14CC pop ebp
00CF14CD ret
现在,我大体的写出C语言循环的汇编指令
(循环变量,常量均用16进制表示)
for 循环
mov <循环变量>,<初始值> ;给循环变量赋初值
jmp B(地址) ;跳到第一次循环处
A:(改动循环变量) ;修改循环变量
.....
B:cmp<循环变量>,<限制变量> ;检查循环条件
jpe 跳出循环
(循环体)
...
jmp A ; 跳回去修改循环变量
while 循环
A: cmp<循环变量>,<限制变量>
jpe B
(循环体)
....
jmp A
B:(循环结束)