Я начал изучать язык ассемблера и сразу же наткнулся на передачу аргументов. Каждое учебное пособие, которое я видел в Интернете (пример: http://www.delorie.com/djgpp/doc/ug/asm/calling.html), объясняет аргументы, передаваемые функциям, как их подталкивание к стеку. Однако, когда я начал экспериментировать, совершенно ясно, что это не так. Для простой функцииПередача аргументов функции ASM
int foo(int a, int b) {
return a + b;
}
генерируется После ASM (составлен на AMD64 с НКУ):
movl %edi, -4(%rbp)
movl %esi, -8(%rbp)
movl -8(%rbp), %eax
movl -4(%rbp), %edx
leal (%rdx,%rax), %eax
совершенно ясно, аргументы передаются в EDI и ESI регистров. Поскольку я добавляю больше аргументов функции, я вижу больше регистров, и только после того, как я достиг 6 аргументов, я начинаю видеть значения, фактически прочитанные из стека. Тем не менее, регистры EDI/ESI в googling не дают мне объяснений их особой роли в передаче аргументов. Что мне здесь не хватает?
Не помогло, извините. Вы повторили то, что я уже понял. Реальным является то, что я могу легко называть что-то, скомпилированное с одним компилятором C из компилируемого с другим. И __stdcall - это нечто из мира MSFT, очень далекого от меня. Должно быть что-то, что позволяет компиляторам использовать это соглашение о вызове, и это должно быть своего рода стандартом. – SergeyA
Существуют стандарты, а не только один унифицирующий. – TeasingDart
Хорошо, ваши последние изменения прояснили ситуацию. Это System V AMD64 ABI, как описано в Wiki. Благодарю. – SergeyA