Du versucht hier 32-Bit
ASM in x64 zu schreiben.
Du solltest dir erstmal die x64 calling convention anschauen, google. Ich erkläre dir mal eben die Basics:
Für nicht float Werte:
Arg1: Rcx, Arg2: Rdx, Arg3: R8, Arg4: R9 und alle weiteren Argumente werden auf dem Stack abgelegt (gleich mehr dazu).
Für float Werte:
Arg1: xmm0, Arg2: xmm1, Arg3: xmm2, Arg4: xmm3 und dann wieder Stack..
In x64 musst du Platz auf dem Stack machen bevor due eine Funktion callst, nennt sich Shadowspace oder scratchspace. Da die ersten vier Parameter via register passed werden, musst du 8*4 also 32 oder 0x20 bytes auf dem Stack reservieren, das heißt Argument 5 fängt dann effektiv bei Rsp-0x28 an. Außerdem musst du den Stackpointer RSP 16byte alignen, weil sonst sowas wie movabs rax, [rsp+x] crashen würde, da das "a" in movaps für aligned steht (gibt auch movups).
Für deinen Code würde das nun bedeuten:
Delphi-Quellcode:
procedure GetParm(Par1: Int64; Par2: Int64);
stdcall;
asm
nop
end;
procedure SendPar;
stdcall;
asm
mov rcx, 1
mov rdx, 2
call GetParm
end;
Da du hier keine "naked" funktion erstellst, wird der compiler automatisch rsp reservieren und shadowspace erstellen. Du könntest es auch manuell machen:
Delphi-Quellcode:
procedure GetParm(Par1: Int64; Par2: Int64);
stdcall;
asm
nop
end;
procedure SendPar;
stdcall;
asm
.NOFRAME
push rbp
// nicht volatiles register rbp auf stack speichern
mov rbp, rsp
sub rsp, 0x28
// shadowspace + 8 byte für alignment
and rsp,
not 8
// stack 16 byte alignen
mov rcx, 1
mov rdx, 2
call GetParm
mov rsp, rbp
pop rbp
ret
end;
grüße