在汇编代码时,我会收到一条错误消息,其中指令在不同的过程中引用一个标签。
这段代码产生两个错误,汇编程序是JWasmR v2.12pre:
single segment stack
assume cs:single,ds:single,ss:single
start:
mov ax, cs
mov ds, ax
mov ax, 4c00h
int 21h
func1 proc
label1:
jmp label2
func1 endp
func2 proc
label2:
call label1
func2 endp
align 2
s16 db 256 dup (0ffh)
single ends
end start错误信息:
test1.asm(13) : Error A2102: Symbol not defined : label2
test1.asm(20) : Error A2102: Symbol not defined : label1我认为每个标签符号都是其各自程序的本地符号。我想在全球范围内禁用这个功能,或者个别地绕过它。我试过使用-Zf选项,它使所有符号都是公开的。文档可以找到这里。
发布于 2020-05-29 04:13:09
在MASM5.1x中,如果没有使用带有语言类型的.MODEL指令,那么PROC中的代码标签是全局范围的。这就是为什么您的代码在MASM5.1x中组装的原因。在JWASM和MASM 6.1+中,这有点不同,因为后面跟着:的代码标签总是在PROC中本地限定作用域。这将导致您所看到的错误。MASM6.1文档讨论了这个问题:
MASM5.1认为,如果模块包含具有语言类型的.MODEL指令,则该过程中用单个冒号定义的代码标签是该过程的本地代码
解决方案是在标签后面使用::,而不是使用:将代码标签标记为全局定义的。文件接着说:
可以使用双冒号运算符定义非作用域标签。
使用::可以使您的代码与MASM 5.1+、6.1+和JWASM汇合。此代码:
func1 proc
label1:
jmp label2
func1 endp
func2 proc
label2:
call label1
func2 endp如以下列方式书写,应起作用:
func1 proc
label1::
jmp label2
func1 endp
func2 proc
label2::
call label1
func2 endp您可以使用-Zm选项(不要与-mz混淆)启用MASM5.1兼容性。以这种方式运行JWASM应该允许您的代码在不发生任何更改的情况下进行组装:
jwasm -Zm filename.asm使用此方法将使PROC中的本地作用域标签具有全局范围。发生的其他变化如下:
选项-Zm (或设置选项M510)将执行:- set选项OLDSTRUCTS - set选项DOTNAME - set选项SETIF2 2:TRUE- set选项偏移:段(如果没有设置模型)- set选项NOSCOPED (如果没有设置语言说明符的模型)-允许定义代码标签后面的数据项-允许REP/REPE/REPNE指令前缀的“无效”使用--将[]和()运算符的优先级从1更改为9。因此,表达式-5bx被解析为(-5)bx,而没有-Zm则被解析为-(5bx),这将产生错误。
对于JWASM和MASM 6.1+,还可以使用以下指令在组装模块顶部指定无作用域选项:
OPTION NOSCOPED此选项在MASM5.1x中不存在,因为这是该汇编程序的行为。如果使用MASM5.1x进行组装,则必须从程序集代码中删除此指令。MASM6.1文档将此选项描述为:
本节中的信息仅适用于MASM5.1代码中的.MODEL指令没有指定语言类型的情况。如果没有语言类型,MASM5.1假设过程中的代码标签没有“作用域”,也就是说,标签不是过程的本地标记。当不处于兼容模式时,即使没有语言类型,MASM6.1也总是为代码标签提供范围。若要强制MASM5.1行为,请在代码中指定选项M510或选项NOSCOPED
https://stackoverflow.com/questions/62072612
复制相似问题