MASM中向PROC传参报错:symbol redefinition : val1 求助
你遇到的symbol redefinition : val1错误,核心原因是全局变量和PROC参数重名——你在.data段定义了名为val1、val2、val3的全局变量,又在DifferentInputs PROC的参数列表里用了完全一样的名字,MASM不允许同一个符号在程序里被重复定义。
另外还有个隐藏问题:你调用DifferentInputs时用了call DifferentInputs,但这个PROC是带参数的stdcall过程,必须用INVOKE指令传递参数,否则参数根本传不进去,还会破坏栈平衡。
修正方案
1. 解决符号重名
把全局变量或者PROC参数的名字改得不一样就行,比如给全局变量加前缀区分:
.data g_val1 DWORD 102 ; 改名为g_val1,避免和参数冲突 g_val2 DWORD 104 g_val3 DWORD 102
2. 正确调用带参数的PROC
用INVOKE指令把全局变量作为参数传给DifferentInputs:
main PROC INVOKE DifferentInputs, g_val1, g_val2, g_val3 ; 用INVOKE传参 INVOKE ExitProcess, 0 main ENDP
3. 完善PROC的栈清理(可选但推荐)
因为是stdcall调用约定,被调用过程需要清理栈上的参数。每个DWORD参数占4字节,3个参数共12字节,所以PROC里的ret可以改成ret 12——不过Irvine32.inc的PROC宏会自动生成栈清理代码,如果你用PROC, 参数列表的写法,直接用ret也可以,宏会帮你处理,但手动写ret 12逻辑更明确。
修正后的完整代码
INCLUDE Irvine32.inc .386 .model flat, stdcall .stack 4096 .data g_val1 DWORD 102 g_val2 DWORD 104 g_val3 DWORD 102 .code main PROC INVOKE DifferentInputs, g_val1, g_val2, g_val3 INVOKE ExitProcess, 0 main ENDP ;Takes 3 inputs and checks to see if any of them are the same DifferentInputs PROC, val1:DWORD, val2:DWORD, val3:DWORD mov eax, val1 cmp eax, val2 ; 这里可以继续编写你的判断逻辑,比如je same等 ret 12 ; 清理3个DWORD参数占用的12字节栈空间 DifferentInputs ENDP End main
内容的提问来源于stack exchange,提问作者Funlamb
相关产品推荐
相关产品推荐

