Jetzt ist der Fall klar, ich habe Register überschrieben. So geht es: `
Code: Alles auswählen
function Print(c: pchar; len: int64): int64; assembler; nostackframe;
asm
Mov Rax, 1
Mov Rdx, len
Mov Rsi, c
Mov Rdi, 1
Syscall
end;
Weiterer Tipp, wenn du mit SysCalls arbeitest: schau dir das Tool strace an. Das gibt alle SysCalls aus, die dein Programm macht inklusive Argumente.

Das sieht man gut, das das WriteLn intern auch einen syscall macht.
Code: Alles auswählen
strace ./project1
execve("./project1", ["./project1"], 0x7ffdeb817420 /* 49 vars */) = 0
getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
rt_sigaction(SIGFPE, {sa_handler=0x425cb0, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x401300}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGSEGV, {sa_handler=0x425cb0, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x401300}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGBUS, {sa_handler=0x425cb0, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x401300}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGILL, {sa_handler=0x425cb0, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x401300}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0x4), ...}) = 0
fstat(2, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0x4), ...}) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0x4), ...}) = 0
fstat(2, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0x4), ...}) = 0
write(1, "syscall demo\n", 13syscall demo
) = 13
gettimeofday({tv_sec=1766906761, tv_usec=238926}, NULL) = 0
gettimeofday({tv_sec=1766906761, tv_usec=284019}, NULL) = 0
write(1, "Rechenzeit: 45093\n", 18Rechenzeit: 45093
) = 18
exit_group(0) = ?
+++ exited with 0 +++
So nebenbei habe ich jetzt den lästigen float point Fehler gefunden, welcher bei C Bindungen auftreten kann., FPC überschreibt knallhart dieses signal.
Code: Alles auswählen
rt_sigaction(SIGFPE, {sa_handler=0x425cb0, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x401300}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0