Assembly rax/rdi不';是否不能转入下一个系统调用?
我目前还不熟悉和学习汇编语言(主要是NASM) 在我正在学习的一个教程中,老师做了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
;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也在写入系统调用上为我重置