在汇编中使用外部变量的值

问题描述 投票:0回答:1

我在汇编中使用.extern变量时遇到了一些麻烦。我怎样才能将它们的值存入寄存器?

.extern a, b, c
.global main

.text
main:
  mov *value of a*, %rax
    ret

我尝试了以下操作:

  1. a之前的输入符号:.a$aa[0]a[1]*a
  2. 试图将.extern视为标签.extern+2等'
  3. 也尝试过.extern a

我想我不太了解.extern的含义以及如何访问它。我已经尝试阅读英特尔的手册,但是找不到有关我需要的任何在线信息-我猜我不知道如何正确地写我的问题,因为我不知道.extern是什么。

如果有人可以向我介绍有关此信息以及如何使用它的信息,我将非常感激。

assembly extern att
1个回答
0
投票

[mov a(%rip), %raxa加载。

mov a, %rax也会这样做,但不要那样做;您始终希望使用相对RIP或整数寄存器来寻址x86-64中的静态存储。]

我认为您缺少的是.extern类似于C ++:它声明符号在其他对象文件中的elsewhere定义。因此,除非您与另一个.o例如在long a = 1;]中在全局范围内编译.c

在GAS中,.extern是空操作,因为已经为当前asm文件中未定义的符号名称假定了这一点。

See the manual

也许您想在.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
© www.soinside.com 2019 - 2024. All rights reserved.