我用VC做了个对话框程序.在里面加了一个button,和一个自己的小函数.
代码如下,很简单的:
void CAbDlg::OnButton1()
{
mybeep();
}
int mybeep()
{
Beep(200,200);
return 200;
}
然后我用OD断在系统Beep()上,跟踪到这两段asm代码:
/**********第一段***************/
00401CE0 > 55 push ebp
00401CE1 8BEC mov ebp, esp
00401CE3 83EC 40 sub esp, 40
00401CE6 53 push ebx
00401CE7 56 push esi
00401CE8 57 push edi
00401CE9 8D7D C0 lea edi, dword ptr [ebp-40]
00401CEC B9 10000000 mov ecx, 10
00401CF1 B8 CCCCCCCC mov eax, CCCCCCCC
00401CF6 F3:AB rep stos dword ptr es:[edi]
00401CF8 8BF4 mov esi, esp
00401CFA 68 C8000000 push 0C8
00401CFF 68 C8000000 push 0C8
00401D04 FF15 C4734100 call dword ptr [<&KERNEL32.Beep>] ; kernel32.Beep
00401D0A 3BF4 cmp esi, esp
00401D0C E8 93020000 call _chkesp ; jmp 到 MSVCRTD._chkesp
00401D11 B8 C8000000 mov eax, 0C8
00401D16 5F pop edi
00401D17 5E pop esi
00401D18 5B pop ebx
00401D19 83C4 40 add esp, 40
00401D1C 3BEC cmp ebp, esp
00401D1E E8 81020000 call _chkesp ; jmp 到 MSVCRTD._chkesp
00401D23 8BE5 mov esp, ebp
00401D25 5D pop ebp
00401D26 C3 retn
/**********第二段asm代码***************/
00401C90 > 55 push ebp
00401C91 8BEC mov ebp, esp
00401C93 83EC 44 sub esp, 44
00401C96 53 push ebx
00401C97 56 push esi
00401C98 57 push edi
00401C99 51 push ecx
00401C9A 8D7D BC lea edi, dword ptr [ebp-44]
00401C9D B9 11000000 mov ecx, 11
00401CA2 B8 CCCCCCCC mov eax, CCCCCCCC
00401CA7 F3:AB rep stos dword ptr es:[edi]
00401CA9 59 pop ecx
00401CAA 894D FC mov dword ptr [ebp-4], ecx
00401CAD E8 DAF3FFFF call 0040108C
00401CB2 5F pop edi ; 0012F940
00401CB3 5E pop esi
00401CB4 5B pop ebx
00401CB5 83C4 44 add esp, 44
00401CB8 3BEC cmp ebp, esp
00401CBA E8 E5020000 call _chkesp ; jmp 到 MSVCRTD._chkesp
00401CBF 8BE5 mov esp, ebp
00401CC1 5D pop ebp
我想第一段就对应了如下函数
int mybeep()
{
Beep(200,200);
return 200;
}
而第二段就对应了如下函数
void CAbDlg::OnButton1()
{
mybeep();
}
我的问题是:
第二段asm代码我不清楚每一句的含义或作用.
希望您帮我翻译一下.
00401C90 > 55 push ebp ;保存ebp
00401C91 8BEC mov ebp, esp ;取堆栈入口地址
00401C93 83EC 44 sub esp, 44 ;堆栈中增加44个空间
......
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!