为什么这个NASM组件不打印?

时间:2013-06-21 14:56:00

标签: assembly x86 nasm

我正在尝试学习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”。有什么解释当我不包括它时会发生什么?

1 个答案:

答案 0 :(得分:1)

您正在使用的系统调用需要一个指向ecx中字符串的指针。这就是添加$的功能 - 将string1放入ecx。如果您离开$,则会将string1中的第一个单词放入ecx - 无论hell的等效数值是多少。在具有ASCII字符串的小端机器上(应该是您的情况),这意味着您将0x6c6c6568放入ecx。该值不太可能是指向任何类型字符串的有效指针,因此系统调用恰好不会打印任何内容。它可能很容易崩溃或引起其他一些疯狂的行为。