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

时间:2018-04-27 12:12:38

标签: linux assembly x86-64 system-calls gas

这是:

.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,否则它会发生段错误,但这不会发生。

1 个答案:

答案 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字节表示导致程序无任何异常或无限循环退出的指令。

所以也许在你的情况下第三种情况就是这样。