我正在尝试学习NASM程序集(在Linux上,所以AT& T语法),但我试图通过系统调用打印“Hello World”。下面的代码汇编并运行正常,但它不会打印任何内容。任何线索为什么?
.text
.globl main
main:
movl $4, %eax
movl $1, %ebx
movl string1, %ecx
movl $20, %edx
int $0x80
.data
string1: .string "hello world"
更新:我找到了。我需要在“string1”前面加一个$符号,所以该行变为“movl $ string1,%ecx”。有什么解释当我不包括它时会发生什么?
答案 0 :(得分:1)
您正在使用的系统调用需要一个指向ecx
中字符串的指针。这就是添加$
的功能 - 将string1
的值放入ecx
。如果您离开$
,则会将string1
中的第一个单词放入ecx
- 无论hell
的等效数值是多少。在具有ASCII字符串的小端机器上(应该是您的情况),这意味着您将0x6c6c6568
放入ecx
。该值不太可能是指向任何类型字符串的有效指针,因此系统调用恰好不会打印任何内容。它可能很容易崩溃或引起其他一些疯狂的行为。