Решил поставить - посмотреть. В модуле x64.inc Есть процедура для Винды:
procedure x64call
Так вот, из-за того, что push[rdx] - не компилится. Беда, что я не понимаю как оно работает.
Ну, вообще, странно, да? А куда проц положит, то, что по адресу rdx, чтобы потом пихнуть в стек? Или я уже давно устарел и так можно?
Вот кусок кода:
- Код: Выделить всё
...
mov rdx, aStack
jmp @compareitems
@work:
//push [rdx]
push rdx
...
Недалеко от начала модуля. Заремил - я. И убрал скобки. А теперь думаю, надо было дописать как по смыслу со скобками или это такая шутка автора?

Вся процедура, на всякий случай:
- Код: Выделить всё
procedure x64call(
Address: Pointer;
out _RAX: IPointer;
_RCX, _RDX, _R8, _R9: IPointer;
var _XMM0: Double;
_XMM1, _XMM2, _XMM3: Double;
aStack: Pointer; aItems: IntPtr); assembler; {$IFDEF FPC}nostackframe;{$ENDIF}
asm
(* Registers:
RCX: Address
RDX: *_RAX
R8: _RCX
R9: _RDX
fpc inserts an 20h emty space
*)
{$IFDEF FPC}
push rbp
mov rbp,rsp
{$ENDIF}
// call debugbreak
push rcx // address
push rdx // _rax
push r8 // _rcx
push r9 // _rdx
mov rcx, aItems
mov rdx, aStack
jmp @compareitems
@work:
//push [rdx]
push rdx
dec rcx
sub rdx,8
@compareitems:
or rcx, rcx
jnz @work
// copy registers
{$IFDEF FPC}
movd xmm0,[_XMM0]
movd xmm1,_XMM1
movd xmm2,_XMM2
movd xmm3,_XMM3
{$ELSE}
movsd xmm0,[_XMM0]
movsd xmm1,_XMM1
movsd xmm2,_XMM2
movsd xmm3,_XMM3
{$ENDIF}
mov RAX, [rbp-8]
mov RCX, [rbp-24]
mov RDX, [rbp-32]
mov R8, _R8
mov R9, _R9
// weird thing on windows, it needs 32 bytes in the CALLEE side to do whatever in
sub RSP, 32
call RAX
add RSP, 32 // undo the damage done earlier
// copy result back
mov RDX, [rbp-16]
mov [RDX], RAX
{$IFDEF FPC}
movd [_XMM0],xmm0
{$ELSE}
movsd [_XMM0],xmm0
{$ENDIF}
pop r9
pop r8
pop rdx
pop rcx
leave
ret
end;