博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学 Win32 汇编[9]: 子过程中的变量声明
阅读量:5756 次
发布时间:2019-06-18

本文共 2409 字,大约阅读时间需要 8 分钟。

  hot3.png

定义子过程的伪指令: PROC、ENDP

; Test9_1.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.code    ;子过程 proc1:    proc1 proc        PrintText 'proc1'    proc1 endp        ;子过程 proc2:    proc2 proc        PrintText 'proc2'    proc2 endp        ;子过程 proc3:    proc3 proc        PrintText 'proc3'    proc3 endp    retend proc1  ;end 后面的 proc1 是入口的子过程名; 这也就是指定主过程.;可以把 end proc1 分别换做 end proc2 和 end proc3 尝试,;如果这是一个供其他程序调用的代码文件, 那么 end 后面就不需要指定.
模仿 C 语言的样子, 以后的程序结构应该这样:

; Test9_2.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data    szText db 'Hello World!', 0DH, 0AH, 0    .codemain proc    PrintString szText  ;Hello World!    retmain endpend main
局部变量要用 local 声明, 和全局变量区别不小:

; Test9_3.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.codemain 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    retmain endpend main
调用子过程:

; Test9_4.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.code;proc1 proc    PrintDec 1    retproc1 endp;proc2 proc    PrintDec 2    retproc2 endp;main proc    PrintDec 0    call proc2    call proc1    retmain endpend main;注释:;最后一行 end main 决定了子过程将被率先调用, 这样它就成了主过程;然后主过程又通过 call 指令顺序调用了 proc2、proc1;这样最后的显示结果将是: 0 / 2 / 1;子过程应该用 ret 指令返回
一个求和函数的例子:

; Test9_5.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.code;求和的函数, 函数返回值在 eax;sum proc v1:dword, v2:dword, v3:dwordsum proc v1, v2, v3 ;这是上一行的简化, 其类型也是默认为 dword    mov eax, v1    add eax, v2    add eax, v3    retsum endp;main proc    invoke sum, 11, 22, 33    PrintDec eax  ;66    retmain endpend main

转载于:https://my.oschina.net/hermer/blog/319190

你可能感兴趣的文章
Linux下的C编程实战
查看>>
[32期] html中部分代码与英语单词关系
查看>>
PHP安装环境,服务器不支持curl_exec的解决办法
查看>>
jQuery|元素遍历
查看>>
用 ThreadLocal 管理用户session
查看>>
setprecision后是要四舍五入吗?
查看>>
上云就是这么简单——阿里云10分钟快速入门
查看>>
MFC多线程的创建,包括工作线程和用户界面线程
查看>>
我的友情链接
查看>>
FreeNAS8 ISCSI target & initiator for linux/windows
查看>>
PostgreSQL数据库集群初始化
查看>>
++重载
查看>>
Rainbond 5.0.4版本发布-做最好用的云应用操作系统
查看>>
nodejs 完成mqtt服务端
查看>>
sql server 触发器
查看>>
[工具]前端自动化工具grunt+bower+yoman
查看>>
关于完成生鲜电商项目后的一点总结
查看>>
noip2012 普及组
查看>>
第二阶段 铁大Facebook——十天冲刺(10)
查看>>
Java判断是否为垃圾_Java GC如何判断对象是否为垃圾
查看>>