不能在Gnu AS表达式中使用'&'运算符

Gnu*_*rou 2 assembly gnu-assembler

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

    .data
    v:        .zero 0x100
    vpage:  .long v & 0xfffff000
Run Code Online (Sandbox Code Playgroud)

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

test.S: Assembler messages:
test.S:3: Error: invalid sections for operation on `v' and `L0'
Run Code Online (Sandbox Code Playgroud)

为什么GAS拒绝计算这个?现在奇怪的部分:用"+"替换'&',代码将编译,链接后甚至可以正确计算地址.任何有关此行为原因或如何解决此问题的提示都将非常受欢迎.

Jes*_*ter 6

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