Насколько я верно понимаю то чтобы передать оставшиеся аргументы через стек,нужно к регистру RSP прибавлять смещение,только вот я не знаю сколько именно нужно прибавлять
Entropy, зависит от того, какие аргументы передаются, вещественные через регистры XMM0-XMM3, целочисленные через регистры RCX, RDX, R8, R9, далее через стек. Допустим, у тебя 10 целочисленных аргументов, которые представляют из себя константы, Код (ASM): sub rsp,50h ;<-- резервируем место для аргументов в стеке mov [rsp+48h],arg10 mov [rsp+40h],arg9 mov [rsp+38h],arg8 mov [rsp+30h],arg7 mov [rsp+28h],arg6 mov [rsp+20h],arg5 mov r9,arg4 mov r8,arg3 mov rdx,arg2 mov rcx,arg1 call foo add rsp,50h;<-- чистим в стеке после себя обычно программист не "парится", а в fasm или masm использует макрос invoke Код (ASM): invoke foo,arg1,arg2,arg3,arg4,arg5,arg6,\ arg7,arg8,arg9,arg10,arg11,arg12
Код (ASM): mov [rsp+20h],arg5 20h + 8 и так по нарастающий аргумент за аргументом ? --- Сообщение объединено, 15 авг 2022 --- не спорю удобно,но я в целях обучения хочу понять
Можно полный код подсмотреть у компилятора: https://godbolt.org/z/n8h7re7Ge Код (C++): extern int func( int a, int b, int c, int d, int x, int y ); int test() { return func( 10, 20, 30, 40, 50, 60 ) + 10; } Код (ASM): int test(void) PROC ; test, COMDAT $LN4: sub rsp, 56 ; 00000038H mov edx, 20 mov DWORD PTR [rsp+40], 60 ; 0000003cH mov DWORD PTR [rsp+32], 50 ; 00000032H lea r9d, QWORD PTR [rdx+20] lea r8d, QWORD PTR [rdx+10] lea ecx, QWORD PTR [rdx-10] call int func(int,int,int,int,int,int) ; func add eax, 10 add rsp, 56 ; 00000038H ret 0 Т.е. сперва нам в целом нужно в стеке выделить место под 6 параметров (округлённых до 8 байт), что есть 48, но т.к. стек нужно поддерживать выровненным по 16, то добавляется 56, т.к. call поместив адрес возврата добъёт это как раз до 64 кратного 16. Далее суть происходящего можно описать как размещение всех параметров справа-налево с верхних адресов в нижние, но 4 последних (т.е. в списке аргументов - первых) из них разбрасывается по регистрам, хотя место под них и зарезервировано. Более того - под 4 параметра место всегда должно быть зарезервировано есть они или нет, поэтому даже вызов функции без параметров (без информации по оптимизации) будет сопровождаться sub rsp, 40 (опять таки как бы под 5 8-байтных параметров для выравнивания).
Разумеется, не дорос! Потому что ты перерос 64, бро! Пора уже конпелировать полностью как ч64, так и! а не только лишь для