我想问为什么写这样的东西是可以的:
.section .data
hello:
.ascii "Hello World\n"
.equ lenhello, . - hello
但是当我输入时它是不对的:
.section .data
hello:
.ascii "Hello World\n"
lenhello:
.long . - hello
调用sys_write函数后第一个代码工作正常,但第二个除了编写hello world之外产生了大量垃圾
答案 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
它与.
符号无关。