为什么这种使用 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个字节代表导致程序无异常退出或死循环的指令。
所以你的情况可能是第三种情况。
这里是:
.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个字节代表导致程序无异常退出或死循环的指令。
所以你的情况可能是第三种情况。