子程序和局部变量

源程序:

 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

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

原文地址:https://www.cnblogs.com/tk091/p/2681705.html