2

我想得到一个变量的地址,并由 4096 编辑(这将对应于它的内存页的地址)。因为这是可以离线计算的东西,所以我做了一些看起来像这样的事情(v 是变量,vpage 应该包含其页面的地址):

    .data
    v:        .zero 0x100
    vpage:  .long v & 0xfffff000

尝试使用 x86 汇编器编译此文件会导致以下错误:

test.S: Assembler messages:
test.S:3: Error: invalid sections for operation on `v' and `L0'

为什么 GAS 会拒绝计算这个?现在奇怪的部分:用“+”替换'&',代码将编译,地址在链接后甚至会被正确计算。任何关于这种行为的原因或如何解决它的提示都将非常受欢迎。

4

2 回答 2

7

这样做的问题是 GAS 生成将由链接器处理的目标文件。虽然 GAS 确实支持按位与运算,但它不能使用绝对地址。它们会被链接器更改,因此 GAS 必须生成仅支持有限操作(主要只是偏移)的重定位条目。如果您可以将绝对地址转换为(本地)相对地址,GAS 可以在组装期间计算它。否则,您将不得不在运行时从代码中执行此操作。

于 2011-02-21T19:11:30.860 回答
0

在 Intel 语法中,您可以使用_AND, _OR, _NOT, _SHL,_SHR或者其他方法来完成此操作。这可能也适用于 GNU 的汇编器。

于 2010-12-14T07:25:07.587 回答