代码之家  ›  专栏  ›  技术社区  ›  user6262188

全局变量,程序集

  •  0
  • user6262188  · 技术社区  · 8 年前
    .code32
    .globl var
    var:
        .long 0
    

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

    。它看起来像全局变量,但它在elf格式文件中的什么位置?在全局节中还是在数据节中?何时会知道var的地址?编译后还是链接后?

    实际上,问题在于理解品托斯的 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

    1 回复  |  直到 8 年前
        1
  •  1
  •   Peter Cordes    8 年前

    它是 AT&T syntax ..谷歌 gas at&t syntax 首页上有很多看起来很有用的链接。

    GNU as(aka 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)
    

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

    何时会知道var的地址?编译后还是链接后?


    addr32 movl %eax, init_ram_pages - LOADER_PHYS_BASE - 0x20000
    

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

    迈克尔·佩奇(Michael Petch)的评论可能会解释链接器填写了什么地址,以及在启用寻呼之前应该如何使用,以回答多部分问题的最后一部分。