Почему сборка x86_64 имеет нечетный порядок аргументов системных вызовов?

Согласно справочной странице syscall в вызове архитектуры соглашения, в нем указываются различные порядки регистров для аргументов системного вызова каждой архитектуры. Все они имеют какой-то логический упорядоченный смысл, кроме x86_64. Например, arm64 использует x0, x1, x2, x3, x4, затем x5 по порядку, что кажется логичным и в числовом порядке. Но для x86_64 порядок следующий: rdi, rsi, rdx, r10, r8, затем r9. Мне это не кажется логичным, что и вызывает у меня замешательство. Почему x86_64 такой?

Спасибо!


person Chiggins    schedule 05.02.2015    source источник
comment
следующий вопрос: почему 32-битные переходы называются near, а не far, когда уже 8-битные переходы называются короткими.   -  person Blechdose    schedule 06.02.2015


Ответы (1)


Обычный порядок пользовательского пространства в соответствии с ABI x86-64: rdi, rsi, rdx, rcx, r8, затем r9. Это не намного логичнее, меня удивляет то, как они это придумали.

Поскольку инструкция syscall убивает rcx, ее нужно было заменить, и для этого был выбран r10. Это как минимум несколько логично :)

person Jester    schedule 05.02.2015