2

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

4

1 回答 1

1

您正在使用的系统调用需要一个指向ecx. 这就是添加的$作用 - 将的string1放入ecx. 如果你离开了$,你把位于的第一个词string1放入ecx- 无论 的等效数值hell恰好是什么。在带有 ASCII 字符串(应该是你的情况)的小端机器上,这意味着你正在0x6c6c6568输入ecx. 该值不太可能是指向任何类型字符串的有效指针,因此系统调用碰巧不打印任何内容。它可能很容易崩溃或导致其他一些疯狂的行为。

于 2013-06-21T15:10:21.407 回答