1

我找到了一个例子,并正在编辑它的气体。

extern printf
.global _start
.data
hello:
db "Hello", 0xa, 0
.text
_start:
mov %rdi, hello
mov %rax, 0
call printf
mov %rax, 0
ret

但它不起作用。怎么了?这是什么意思:

    hello:
db "Hello", 0xa, 0

我明白它的内存范围,但我不明白这个字符串

db "Hello", 0xa, 0

和这里

_start:
mov %rdi, hello
mov %rax, 0
call printf
mov %rax, 0
ret

操作系统:Linux(debian)。英特尔 64 位

4

3 回答 3

1

它是空字节终止符。众所周知的 C 字符串。字符串末尾的此类字节表示字符串的结束位置。例如,您将指向您的字符串的指针传递给一个例程,该例程将理解该字符串在内存中的区域是从乞求a[0](用 C 术语来说)直到a[x] == 0被看到。

于 2013-03-23T17:08:19.617 回答
0

所做的只是将字节放入程序中。字节是字符“Hello”,然后是 0xa(这是行终止符),最后是 NULL 字节。在 C 语言中,它类似于 "char *hello = "Hello\n";"

在您的 _start: 标签处,将hello标签的地址放入寄存器 %rdi,将 0 放入 %rax,然后调用该printf函数。

于 2013-03-23T16:44:04.890 回答
0

下面声明了一个带有 Hello 的字符串,后跟换行符和空终止符。C 字符串需要空终止符

db "Hello", 0xa, 0

要调用 printf,您需要在堆栈上传递参数,因此它类似于

mov hello, (%esp)
call printf

据我所知,约定是 mov source, destination。您似乎以相反的方式对其进行了编码。

于 2013-03-23T17:01:13.023 回答