x86_64 SysV ABI вызов вызова функции определяет целочисленный аргумент # 4, который должен быть передан в регистре rcx
. С другой стороны, с помощью командной строки ядра Linux ABI используется r10
для этой же цели. Все остальные аргументы передаются в одних и тех же регистрах для обеих функций и системных вызовов.
Это приводит к некоторым странным вещам. Проверьте, например, реализацию mmap
в glibc для платформы x32 (для которой существует такое же несоответствие):
00432ce0 <__mmap>:
432ce0: 49 89 ca mov %rcx,%r10
432ce3: b8 09 00 00 40 mov $0x40000009,%eax
432ce8: 0f 05 syscall
Итак, все регистры уже установлены, за исключением того, что мы перемещаем rcx
в r10
.
Мне интересно, почему бы не определить, что syscall ABI будет таким же, как вызов функции ABI, учитывая, что они уже настолько похожи.