GNU汇编程序,点表示法(当前地址)

时间:2014-06-04 21:25:22

标签: assembly gnu

我想问为什么写这样的东西是可以的:

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

但是当我输入时它是不对的:

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

调用sys_write函数后第一个代码工作正常,但第二个除了编写hello world之外产生了大量垃圾

1 个答案:

答案 0 :(得分: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

它与.符号无关。