Assembly rax/rdi不';是否不能转入下一个系统调用?

Assembly rax/rdi不';是否不能转入下一个系统调用?,assembly,nasm,x86-64,Assembly,Nasm,X86 64,我目前还不熟悉和学习汇编语言(主要是NASM) 在我正在学习的一个教程中,老师做了 ;Input codes, entry points, etc. _showAge: mov rax, 1 mov rdi, 1 mov rsi, ageTxt mov rdx, 13 syscall ;"Your age is: " mov rax, 1 mov rdi, 1 mov rsi, age mov rdx, 3 sy

我目前还不熟悉和学习汇编语言(主要是NASM)

在我正在学习的一个教程中,老师做了

;Input codes, entry points, etc.

_showAge:
    mov rax, 1
    mov rdi, 1
    mov rsi, ageTxt
    mov rdx, 13
    syscall ;"Your age is: "

    mov rax, 1
    mov rdi, 1
    mov rsi, age
    mov rdx, 3
    syscall
    ret
它按预期工作。但是当我试图自己缩短代码时

_showAge:
    mov rax, 1
    mov rdi, 1
    mov rsi, ageTxt
    mov rdx, 13
    syscall ;"Your age is: "

    mov rsi, age
    mov rdx, 3
    syscall ; Doesn't do anything
    ret
这不再起任何作用,
我的问题是,为什么我们不能像上面所示那样执行以下代码,其背后的原因是什么


(此脚本已在Linux x86_64、Ubuntu中测试并运行)

系统调用在
rax
中返回结果。因此,在系统调用之前
rax
中的任何内容在系统调用之后都不会出现。由于技术原因,
rcx
r11
寄存器也会被系统调用破坏。所有其他寄存器的内容都由内核保存。

系统调用在
rax
中返回结果。因此,在系统调用之前
rax
中的任何内容在系统调用之后都不会出现。由于技术原因,
rcx
r11
寄存器也会被系统调用破坏。所有其他寄存器的内容都由内核保留。

rax
用于返回值,因此不能依赖其值保持不变
rdi
被保留。副本答案中x86-64部分的第2点是“系统调用是通过syscall指令完成的。这将删除%rcx和%r11,以及%rax,但其他寄存器被保留。”使用
strace
查看系统调用您的代码实际执行的操作。(例如,如果写入返回值成功,则使用
eax=13
)。rtfm对于系统调用中受影响和未受影响的寄存器列表,请参见
rax
,用于返回值,因此不能依赖其值不变
rdi
被保留。副本答案中x86-64部分的第2点是“系统调用是通过syscall指令完成的。这将删除%rcx和%r11,以及%rax,但其他寄存器被保留。”使用
strace
查看系统调用您的代码实际执行的操作。(例如,使用写入返回值的
eax=13
,假设成功)。rtfm有关系统调用中受影响和未受影响的寄存器列表,请参阅出于某种原因rdx也在写入系统调用上为我重置出于某种原因rdx也在写入系统调用上为我重置