我想获取一个变量的地址并加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为什么拒绝计算?现在很奇怪的部分:用“ +”替换“&”,代码将编译,甚至在链接后也可以正确计算地址。任何关于为什么这种行为或如何解决它的提示都将受到欢迎。
最佳答案
问题在于GAS会生成目标文件,链接程序会对其进行处理。虽然GAS确实支持按位AND运算,但绝对地址不能这样做。链接器可能会更改它们,因此GAS必须生成仅支持有限操作(主要是偏移)的重定位条目。如果您可以将绝对地址转换为(本地)相对地址,那么GAS可以在组装期间对其进行计算。否则,您将必须在运行时通过代码来完成。
关于assembly - 无法在Gnu AS表达式中使用'&'运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4436801/