全局变量,程序集
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 x86 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 填写的地址与启用分页之前应该如何使用它,以回答多部分问题的最后一部分。
.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 x86 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 填写的地址与启用分页之前应该如何使用它,以回答多部分问题的最后一部分。