全局变量,汇编

时间:2016-09-05 14:21:36

标签: assembly x86 att

.code32
.globl var
var:
    .long 0

让我们假设精灵二进制格式。 这是一个装配(我不知道它是什么装配, 我熟悉nasm)。 我无法理解它是什么意思。

如何解释? 。它看起来像全局变量,但它在精灵格式文件中的位置?在全球部分或数据部分?什么时候会知道var的地址?编译后或链接后?

实际上,问题在于了解Pintos的start.S文件。 https://github.com/abhinav-upadhyay/Pintos/blob/master/threads/start.S

请注意,在202行中存在同样的问题。但是,我无法理解为什么在48行: addr32 movl %eax, init_ram_pages - LOADER_PHYS_BASE - 0x20000 看起来init_ram_pages是虚假的地址。但请注意,在48行中,CPU仍处于实模式!

1 个答案:

答案 0 :(得分:1)

这是AT&T syntax .. Google gas at&t syntax,首页上充满了看似有用的链接。

GNU as(又名gas)的官方手册是https://sourceware.org/binutils/docs/as/。另请参阅标记wiki。

NASM等效物是

BITS 32                ;; .code32

;section .text         ;; This is the default for gas, same as for NASM
global var             ;; .globl var
var:                   ;; var:
    dd 0               ;;   .long 0  (GAS's terminology comes from before AMD64.  .quad is a qword)
  

在elf格式文件中的位置?在全局部分或数据部分?

IIRC,默认部分为.text。没有“全球”部分。

  

什么时候会知道var的地址?编译后或链接后?

与NASM相同:符号地址是链路时间常数,但同一部分中两个地址之间的差异是汇编时常数。

addr32 movl %eax, init_ram_pages - LOADER_PHYS_BASE - 0x20000

addr32表示必要时使用地址大小的前缀,并使用32位机器编码对寻址模式进行编码。

Michael Petch的评论可能会阐明链接器填充的地址与启用分页之前应如何使用它的方式,以回答多部分问题的最后部分。