【问题标题】:GNU Assembler, dot notation (current address)GNU 汇编器,点表示法(当前地址)
【发布时间】:2014-06-04 21:25:21
【问题描述】:

我想问一下为什么可以这样写:

.section .data
hello:
    .ascii "Hello World\n"
.equ lenhello, . - hello

但是我输入的时候不对:

.section .data
hello:
    .ascii "Hello World\n"
lenhello:
    .long . - hello

调用 sys_write 函数后,第一个代码可以正常工作,但是第二个除了写 hello world 之外会产生很多垃圾

【问题讨论】:

    标签: assembly gnu


    【解决方案1】:

    您忘记展示您如何使用该值。如果你这样做 movl lenhello, %edx 它应该可以正常工作。我假设您改为使用movl $lenhello, %edx

    .equ 指令定义了一个符号,其值为长度,因此您将其引用为 $lenhello。它不保留任何内存。使用您的第二个版本,您在内存中定义一个包含长度的变量。 $lenhello 在这种情况下将是变量的地址,而不是长度。

    完整示例代码:

    .section .data
    hello:
        .ascii "Hello World\n"
    lenhello:
        .long . - hello
    
    .text
    .globl _start
    _start:
        movl $1, %ebx
        movl $hello, %ecx
        movl lenhello, %edx
        movl $4, %eax
        int $0x80
        movl $1, %eax
        movl $0, %ebx
        int $0x80
    

    它与. 符号无关。

    【讨论】:

      猜你喜欢
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 2014-06-19
      • 2011-07-11
      • 2013-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多