You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 21:27:17