这是:
.SECTION .data
msg: .string "AAAA"
.SECTION .text
.globl _start
_start:
mov $1, %rax
mov $1, %rdi
mov msg, %rsi
mov $4, %rdx
syscall
此代码不仅不段错误,它也不会输出任何内容 根据我读过的内容,一个程序应该调用sys_exit,否则它会发生段错误,但这不会发生。
答案 0 :(得分:1)
mov msg, %rsi
该指令将“msg”处的数据解释为64位值,并将该值加载到寄存器rsi
中。该指令不会将“msg”的地址加载到寄存器rsi
中。这可以通过(注意$
):
mov $msg, %rsi
根据我所读到的,程序应该调用sys_exit,否则会发生段错误,但这不会发生。
你必须知道为什么发生了段错误:
CPU不知道程序的“结束”在哪里。 CPU也无法区分指令和数据。
例如,0x8A, 0x07
字节可能表示mov (%rdi),%al
,或者它们可能代表数字1930
- CPU不知道。
当程序结束时,CPU将尝试读取>>程序后的字节并将其解释为指令。
现在可能有三种情况:
由于在x86系统上以4096字节块管理RAM。因此,根据您的程序长度,最多4095字节的“未使用”RAM将跟随您的程序。
CPU会将RAM中的(随机)字节解释为(汇编程序)指令并执行这些指令。
当到达4096字节块的末尾时,会发生段错误。
4095字节包含导致段错误的指令(在到达块结束之前)。
4095字节表示导致程序无任何异常或无限循环退出的指令。
所以也许在你的情况下第三种情况就是这样。