首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁用JWasm中的本地标签

禁用JWasm中的本地标签
EN

Stack Overflow用户
提问于 2020-05-28 19:05:58
回答 1查看 165关注 0票数 2

在汇编代码时,我会收到一条错误消息,其中指令在不同的过程中引用一个标签。

这段代码产生两个错误,汇编程序是JWasmR v2.12pre:

代码语言:javascript
复制
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

错误信息:

代码语言:javascript
复制
test1.asm(13) : Error A2102: Symbol not defined : label2
test1.asm(20) : Error A2102: Symbol not defined : label1

我认为每个标签符号都是其各自程序的本地符号。我想在全球范围内禁用这个功能,或者个别地绕过它。我试过使用-Zf选项,它使所有符号都是公开的。文档可以找到这里

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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汇合。此代码:

代码语言:javascript
复制
func1 proc
label1:
    jmp label2
func1 endp

func2 proc
label2:
    call label1
func2 endp

如以下列方式书写,应起作用:

代码语言:javascript
复制
func1 proc
label1::
    jmp label2
func1 endp

func2 proc
label2::
    call label1
func2 endp

您可以使用-Zm选项(不要与-mz混淆)启用MASM5.1兼容性。以这种方式运行JWASM应该允许您的代码在不发生任何更改的情况下进行组装:

代码语言:javascript
复制
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+,还可以使用以下指令在组装模块顶部指定无作用域选项:

代码语言:javascript
复制
OPTION NOSCOPED

此选项在MASM5.1x中不存在,因为这是该汇编程序的行为。如果使用MASM5.1x进行组装,则必须从程序集代码中删除此指令。MASM6.1文档将此选项描述为:

本节中的信息仅适用于MASM5.1代码中的.MODEL指令没有指定语言类型的情况。如果没有语言类型,MASM5.1假设过程中的代码标签没有“作用域”,也就是说,标签不是过程的本地标记。当不处于兼容模式时,即使没有语言类型,MASM6.1也总是为代码标签提供范围。若要强制MASM5.1行为,请在代码中指定选项M510或选项NOSCOPED

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62072612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档