子程序和局部变量
源程序:
1 .386 2 .model flat,stdcall 3 option casemap:none 4 5 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 6 ;包含头文件 7 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 8 include windows.inc 9 include user32.inc 10 include kernel32.inc 11 12 includelib user32.lib 13 includelib kernel32.lib 14 15 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 16 ;data section 17 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 18 19 .data 20 szText db 'win32汇编程序',0 21 szCaption db '这里是标题',0 22 23 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 24 ;一个子程序,用于测试局部变量 25 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 26 TestProc proc 27 28 LOCAL @loc1:dword,@loc2:word 29 LOCAL @loc3:byte 30 31 mov eax,@loc1 32 mov ax,@loc2 33 mov al,@loc3 34 ret 35 36 TestProc endp 37 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 38 ;code section 39 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 40 .code 41 start: 42 invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK 43 call TestProc 44 invoke ExitProcess,NULL 45 end start
我们来看看子程序的反汇编代码:
00403019 55 push ebp 0040301A 8BEC mov ebp, esp ; 现场保护 0040301C 83C4 F8 add esp, -8 ; 空间申请 0040301F 8B45 FC mov eax, dword ptr [ebp-4] 00403022 66:8B45 FA mov ax, word ptr [ebp-6] 00403026 8A45 F9 mov al, byte ptr [ebp-7] 00403029 C9 leave 0040302A C3 retn
这里没有对局部变量进行初始化,dword ptr [ebp-4]中的内容是随机的,是其它子程序留下的垃圾数据。
在学习的初期,不要过多的深入,不然会迷失自己。
循序渐进。
00401000 >/$ 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL 00401002 |. 68 0E304000 push 0040300E ; |Title = "这里是标题" 00401007 |. 68 00304000 push 00403000 ; |Text = "win32",BB,"惚喑绦? 0040100C |. 6A 00 push 0 ; |hOwner = NULL 0040100E |. E8 0D000000 call <jmp.&user32.MessageBoxA> ; \MessageBoxA 00401013 |. E8 01200000 call 00403019 ; 跳转到子程序 00401018 |. 6A 00 push 0 ; /ExitCode = 0 0040101A \. E8 07000000 call <jmp.&kernel32.ExitProcess> ; \ExitProcess 0040101F CC int3 00401020 $- FF25 08204000 jmp dword ptr [<&user32.MessageBoxA>] ; user32.MessageBoxA 00401026 .- FF25 00204000 jmp dword ptr [<&kernel32.ExitProcess>] ; kernel32.ExitProcess
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。