全局变量,程序集

Global variable, assembly

.code32
.globl var
var:
    .long 0

让我们假设 elf 二进制格式。 这是一个组件(我不知道它到底是什么组件, 我熟悉 nasm)。 我不明白这是什么意思。

它是如何解释的? .它看起来像全局变量,但它在 elf 格式文件中的什么位置?在全局部分还是在数据部分?什么时候可以知道 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 仍然处于实模式!

AT&T syntax.. Google gas at&t syntax 并且首页满是 link 看起来很有用。

GNU as(又名 gas)的官方手册是 https://sourceware.org/binutils/docs/as/. See also the tag 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)

where it in an elf format file? In global section or in data section?

IIRC,默认部分是.text。没有 "global" 部分。

When will be known address of var? After compilation or after linking?

与NASM相同:符号地址是link-时间常数,但同一段中的两个地址之间的差异是assemble-时间常数。


addr32 movl %eax, init_ram_pages - LOADER_PHYS_BASE - 0x20000

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

Michael Petch 的评论可能会阐明 linker 填写的地址与启用分页之前应该如何使用它,以回答多部分问题的最后一部分。