ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

学 Win32 汇编[9]: 子过程中的变量声明

2021-04-30 12:03:11  阅读:194  来源: 互联网

标签:汇编 main 变量 lib includelib Win32 include proc1 inc


学 Win32 汇编[9]: 子过程中的变量声明


定义子过程的伪指令: PROC、ENDP
; Test9_1.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
    ;子过程 proc1:
    proc1 proc
        PrintText 'proc1'
    proc1 endp
    
    ;子过程 proc2:
    proc2 proc
        PrintText 'proc2'
    proc2 endp
    
    ;子过程 proc3:
    proc3 proc
        PrintText 'proc3'
    proc3 endp

    ret
end proc1  ;end 后面的 proc1 是入口的子过程名; 这也就是指定主过程.

;可以把 end proc1 分别换做 end proc2 和 end proc3 尝试,
;如果这是一个供其他程序调用的代码文件, 那么 end 后面就不需要指定.

模仿 C 语言的样子, 以后的程序结构应该这样:
; Test9_2.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.data
    szText db 'Hello World!', 0DH, 0AH, 0
    
.code
main proc
    PrintString szText  ;Hello World!
    ret
main endp
end main

局部变量要用 local 声明, 和全局变量区别不小:
; Test9_3.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
main proc
    ;局部变量中的类型不能使用缩写
    LOCAL v1: dword
    
    ;可用逗号间隔写在一行
    LOCAL v2: dword, v3: dword
    
    ;不指定类型时默认 DWORD(在 Win32 下)
    LOCAL v4
    
    ;数组
    LOCAL v5[3]: dword
    
    ;在手动初始化前, 局部变量中都是些垃圾值:
    PrintDec v1
    PrintDec v2
    PrintDec v3
    PrintDec v4
    mov eax, v5[0]
    PrintDec eax
    ret
main endp
end main

调用子过程:
; Test9_4.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
;
proc1 proc
    PrintDec 1
    ret
proc1 endp
;
proc2 proc
    PrintDec 2
    ret
proc2 endp
;
main proc
    PrintDec 0
    call proc2
    call proc1
    ret
main endp
end main

;注释:
;最后一行 end main 决定了子过程将被率先调用, 这样它就成了主过程
;然后主过程又通过 call 指令顺序调用了 proc2、proc1
;这样最后的显示结果将是: 0 / 2 / 1
;子过程应该用 ret 指令返回

一个求和函数的例子:
; Test9_5.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
;求和的函数, 函数返回值在 eax
;sum proc v1:dword, v2:dword, v3:dword
sum proc v1, v2, v3 ;这是上一行的简化, 其类型也是默认为 dword
    mov eax, v1
    add eax, v2
    add eax, v3
    ret
sum endp
;
main proc
    invoke sum, 11, 22, 33
    PrintDec eax  ;66
    ret
main endp
end main

posted on 2010-04-05 20:23  万一  阅读(3038)  评论(1)  编辑  收藏

标签:汇编,main,变量,lib,includelib,Win32,include,proc1,inc
来源: https://blog.51cto.com/u_14617575/2745509

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有