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拒绝计算这个?现在奇怪的部分:用"+"替换'&',代码将编译,链接后甚至可以正确计算地址.任何有关此行为原因或如何解决此问题的提示都将非常受欢迎.
这个问题是GAS生成将由链接器处理的目标文件.虽然GAS确实支持按位AND操作,但它不能使用绝对地址.它们可能会被链接器更改,因此GAS必须生成仅支持有限操作的重定位条目(主要只是偏移).如果您可以将绝对地址转换为(本地)相对地址,GAS可以在汇编时计算它.否则,您必须在运行时从代码中执行此操作.