为什么这种使用 sys_write 的尝试没有做任何事情?

Why doesn't this attempt at using sys_write do anything?

这里是:

.SECTION .data
    msg: .string "AAAA"

.SECTION .text

.globl _start

_start:
    mov , %rax
    mov , %rdi
    mov msg, %rsi
    mov , %rdx
    syscall

这段代码不仅没有段错误,而且什么也不输出。
根据我读到的内容,程序应该调用 sys_exit,否则会发生段错误,但这不会发生。

mov msg, %rsi

该指令将 "msg" 中的数据解释为 64 位值并将该值加载到寄存器 rsi 中。该指令不会将 "msg" 的地址加载到寄存器 rsi 中。这可以通过(注意 $)来完成:

mov $msg, %rsi

According to what I've read, a program should call sys_exit, or it would segfault, but this does not happen.

你必须知道为什么会发生段错误:

CPU不知道你程序的"end"在哪里。 CPU也可以不区分指令和数据。

字节 0x8A, 0x07 例如可能表示 mov (%rdi),%al 或者它们可能表示数字 1930 - CPU 不知道。

当到达程序末尾时,CPU 将尝试读取程序之后 的字节,并将它们解释为指令。

现在可能出现三种情况:

  • 因为 RAM 在 x86 系统上以 4096 字节块的形式进行管理。因此,根据您的程序的长度,最多 4095 字节的 "unused" RAM 会跟随您的程序。

    CPU会将RAM中的(随机)字节解释为(汇编)指令并执行这些指令。

    当到达 4096 字节块的末尾时发生段错误。

  • 4095 字节包含导致段错误的指令(在到达块末尾之前)。

  • 这4095个字节代表导致程序无异常退出或死循环的指令。

所以你的情况可能是第三种情况。