linux - 尝试在 Linux 上的 NASM 中编写 for 循环时出现段错误

标签 linux assembly x86 nasm

为了好玩,我正尝试编写一个简单的 NASM 程序,但我似乎无法弄清楚如何在其中编写 for 循环。使用以下代码,我得到了一个段错误。下面的代码应该打印出“Hello world!”然后是从 1 到 100 的所有数字。

section .data
    message: db 'Hello world!', 10
    messageLength: equ $-message

section .text
    global _start

_start:
    mov eax, 4
    mov ebx, 1
    mov ecx, message
    mov edx, messageLength
    int 80h

    mov ecx, 0
    jmp loop

    mov eax, 1
    mov ebx, 0
    int 80h

loop:
    mov eax, 4
    mov ebx, 1
    mov edx, 1
    int 80h

    add ecx, 1
    cmp ecx, 100
    jl loop

最佳答案

在跳转到循环之前,您将 0 分配给 ECX...

这意味着您的程序将尝试打印位于内存地址 0 的字符串,您不拥有该字符串,因此出现段错误...

请记住,您正在处理内存地址。 将 10 分配给寄存器值实际上不会打印 10,在 ASCII 中...这只是意味着您正在获取内存地址 10...

关于linux - 尝试在 Linux 上的 NASM 中编写 for 循环时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5358355/

相关文章:

c - setuid 与 seteuid 函数

linux - 哪些库应该作为依赖项进入 pkg-config 文件?

xml - 在一个字段 XML 中复制数据

c - 机器代码指令如何传输到 CPU?

performance - 分支指令如何被错误预测和停用?

x86 - 为什么 x86 中存在 CLFLUSH?

linux - 不区分大小写的哈希键 perl

graphics - 经典的侧滚轮是如何实现定时事件和动画触发器的?

assembly - 此代码如何在汇编中工作

C++ 内联程序集试图将 char 从 std::string 复制到寄存器中