2

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

我试过:

测试.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。

提前感谢您的帮助。

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

4

2 回答 2

3

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

dd (mylabel - $$) | 0x80000000

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

这样做的目的是什么?

最好的,弗兰克

于 2010-12-07T01:55:36.480 回答
0

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

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

第 3.7 节

于 2010-12-05T18:38:44.567 回答