• 子程序和局部变量


    源程序:

     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

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

  • 相关阅读:
    STM32(五)固件库文件分析
    STM32(四)GPIO初始化顺序
    STM32(三)GPIO的8种工作模式介绍
    date命令详解
    "System.Security.Cryptography.CryptographicException: 拒绝访问" 问题的解决方法
    记录一次win2003服务器的IIS服务加载.flv后缀的资源报错404的处理方法
    Linux之修改主机名(永久生效)
    Python3 isdigit()方法
    Python3 字典 items() 方法
    Linux shell脚本中shift的用法说明
  • 原文地址:https://www.cnblogs.com/tk091/p/2681705.html
Copyright © 2020-2023  润新知