我正在Linux上学习x86_64程序集,我遇到了一些我希望可以解决的冲突信息。一方面,我已经读过,对于syscall参数,你会按照rdi,rsi,rdx等顺序使用寄存器。但另一方面,我读过你使用寄存器rbx,rcx,rdx等。有人告诉我,这是因为ABI的原因,但我并不完全明白这究竟意味着什么。
所以我想我要问的是,为什么这两种格式和哪种格式适合使用?
谢谢!
答案 0 :(得分:5)
根据this Wikibooks page,它取决于您使用哪条指令来执行系统调用。
如果您使用的是int $0x80
,则应使用eax
作为系统调号,ebx
,ecx
,edx
,{参数的{1}},esi
和edi
(按此顺序)。
如果您使用ebp
指令,则应使用syscall
作为系统调用号码,rax
,rdi
,rsi
,{ {1}},rdx
和r10
参数。
我认为使用r8
是首选,因为它更快。