我在汇编中使用.extern变量时遇到了一些麻烦。我怎样才能将它们的值存入寄存器?
.extern a, b, c
.global main
.text
main:
mov *value of a*, %rax
ret
我尝试了以下操作:
.a
,$a
,a[0]
,a[1]
,*a
.extern+2
等'.extern a
我想我不太了解.extern的含义以及如何访问它。我已经尝试阅读英特尔的手册,但是找不到有关我需要的任何在线信息-我猜我不知道如何正确地写我的问题,因为我不知道.extern
是什么。
如果有人可以向我介绍有关此信息以及如何使用它的信息,我将非常感激。
[mov a(%rip), %rax
从a
加载。
(mov a, %rax
也会这样做,但不要那样做;您始终希望使用相对RIP或整数寄存器来寻址x86-64中的静态存储。]
我认为您缺少的是.extern
类似于C ++:它声明符号在其他对象文件中的elsewhere定义。因此,除非您与另一个.o
例如在long a = 1;
]中在全局范围内编译.c
在GAS中,.extern
是空操作,因为已经为当前asm文件中未定义的符号名称假定了这一点。
也许您想在.data
部分中保留一些空间并在该空间上放置标签,就像C编译器在声明全局变量时那样:
long a; long main(){ // with int main GCC optimizes to loading only EAX return a; }
使用GCC -O3编译为以下汇编,简化为手写版本要保留的部分:
main: mov a(%rip), %rax ret .comm a,8,8 # reserve 8 bytes in the BSS and call it a
如果我们使用了
long a = 1;
(一个非零的初始值设定项:
.data # switch to the .data section
.globl a # declare a as externally visible, like a C global not static
a: # a label declares a symbol with address = this position
.quad 1 # a qword with integer value 1