【问题标题】:NASM - Extending label with bit flagNASM - 使用位标志扩展标签
【发布时间】:2010-12-05 18:16:01
【问题描述】:

我需要设置一些标签地址/偏移量的最高位。

我试过了:

test.nasm:

BITS 32

dw mylabel | 0x8000

mylabel:
dd 0

但是当我尝试组装这个时,我得到:

nasm -f bin test.nasm
test.nasm:3: error: `|' operator may only be applied to scalar values

为什么它不将 mylabel 视为标量值?我认为标签只是被汇编器替换为它们的地址(标量值)。

如果这很重要,我正在使用 nasm v 2.09.04。

提前感谢您的帮助。

编辑: 我已经能够使用 + 代替 |。看起来好像按位运算符不适用于标签。你怎么看,这是故意的还是错误的?

【问题讨论】:

    标签: label nasm flags bit scalar


    【解决方案1】:

    标签是一个可重定位的值 - 它的值由链接器/加载器修改。两个标签(在同一节中)之间的差异是一个标量值,Nasm 将使用它。

    dd (mylabel - $$) | 0x80000000

    我纠正了 32 位代码中的标签对你来说也是 16 位的误解。

    这样做的目的是什么?

    最好, 弗兰克

    【讨论】:

    • dw 应该存储 mylabel-label 从文件开头开始的偏移量(作为 16 位值),但它必须用一些标志进行扩展。我正在手动编写 win exe (PE) 文件/图像的 .reloc 部分。
    【解决方案2】:

    我的猜测是这是汇编器的限制,因为 nasm 是一个两遍汇编器,它难以处理的是“代码的大小取决于相关代码之后声明的符号的值。”

    http://www.posix.nl/linuxassembly/nasmdochtml/nasmdoc3.html

    第 3.7 节

    【讨论】:

    • 但是如果我之前定义了 mylabel 也会失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多