我想得到变量的地址和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拒绝计算?现在奇怪的部分:替换'&'通过“+”,代码将编译,链接后甚至可以正确计算地址。任何有关此行为原因或如何解决此问题的提示都将非常受欢迎。
答案 0 :(得分:6)
这个问题是GAS生成将由链接器处理的目标文件。虽然GAS确实支持按位AND操作,但它不能使用绝对地址。它们可能会被链接器更改,因此GAS必须生成仅支持有限操作的重定位条目(主要只是偏移)。如果您可以将绝对地址转换为(本地)相对地址,GAS可以在汇编时计算它。否则,您必须在运行时从代码中执行此操作。
答案 1 :(得分:0)
在英特尔语法中,您可以使用_AND
,_OR
,_NOT
,_SHL
,_SHR
以及其他人来完成此操作。这可能也适用于GNU的汇编程序。