【问题标题】:Why This NASM Assembly is Not Printing?为什么这个 NASM 程序集不打印?
【发布时间】:2013-06-21 14:56:00
【问题描述】:

我正在尝试学习 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”。如果我不包含它会发生什么,有什么解释吗?

【问题讨论】:

  • 为了清楚起见,这不是 Nasm。这是“AT&T 语法”。 Gas 使用它,Yasm 会接受它作为替代方案,但 Nasm 不会......

标签: assembly x86 nasm


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    相关资源
    最近更新 更多