Я вот об этом как раз хотел спросить.Ali писал(а):Думаю х86_64 будет впереди в основном за счет передачи параметров процедур через регистры
Но вы меня опередили:
(не надо было убирать, я только мельком успел почитать).Ali писал(а): Убрал пример. Плохой получился. Идея была в том, что обычные сишные процедуры используют регистры, а не стек.
Так вот:
- в рекламных текстах и в разговорах распальцованных пацанов на форумах я не один раз встречал упоминания о передаче параметров процедур через регистры...
- но или они забрехались ... или я ничего не пойму.
- параметры передаются в С процедуру согласно "С соглашениям о связях", так же как есть "PASCAL соглашения о связях" (много используемые в Win32)... - эти соглашения (и только они в правилах языка!) определяют как передаются параметры и кто и как убирает кадр стека после выполнения.
- параметры в функции С могут передаваться через регистры, то только (я знаю) в 2-х случаях: а). функция явно описана с квалификатором asmlinkage (это многократно встречается в ядре Linux), б). при высоких уровнях оптимизации (-o3 ?) указанных компилятору GCC (это был бы крантец просто с отладкой, если б GCC стал это делать в штатном режиме компиляции!).
- ... и тот и другой предыдущие случаи не зависят и не могут от того, это 32 бит, или 64 ... или сколько угодно.
- единственный случай, когда можно понять рекламистов, это если речь идёт о системных вызовах - sys call(): там в классической 32 бит архитектуре если до 6-ти параметров, то они передаются в регистрах, а если >6, то блоком в стеке.
- но!!! много ли системных вызовов у которых >6 параметров (я не помню, может и нет уже вообще, а если есть, то 1-2 из пару сотен syscall() ... mmap?).
P.S. (дописано позже) - здесь я уже сам себя запутал:
- при >6-ти параметров syscall(), параметры блоком располагаются в произвольном месте в памяти, а адрес этого блока передаётся в регистре ebx - в этом месте выше ошибка.
Так что разговоры о "передаче параметров процедур через регистры" - это, похоже, просто "ля-ля"