51 lines
1.5 KiB
HolyC
51 lines
1.5 KiB
HolyC
#define PUSH_SYSV_REGS \
|
|
asm {PUSH RCX PUSH RDX PUSH RBX PUSH RBP PUSH RSI PUSH RDI PUSH R8 PUSH R9 PUSH \
|
|
R10 PUSH R11 PUSH R12 PUSH R13 PUSH R14 PUSH R15}
|
|
#define POP_SYSV_REGS \
|
|
p0 = p0; \
|
|
p1 = p1; \
|
|
p2 = p2; \
|
|
p3 = p3; \
|
|
p4 = p4; \
|
|
p5 = p5; \
|
|
asm {POP R15 POP R14 POP R13 POP R12 POP R11 POP R10 POP R9 POP R8 POP RDI POP \
|
|
RSI POP RBP POP RBX POP RDX POP RCX}
|
|
#define GET_SYSV_ARGS \
|
|
asm {PUSH R9 PUSH R8 PUSH RCX PUSH RDX PUSH RSI PUSH RDI} \
|
|
I64 reg RDI p0; \
|
|
I64 reg RSI p1; \
|
|
I64 reg RDX p2; \
|
|
I64 reg RCX p3; \
|
|
I64 reg R8 p4; \
|
|
I64 reg R9 p5; \
|
|
asm {POP RDI POP RSI POP RDX POP RCX POP R8 POP R9}
|
|
|
|
#define MOV_ANS_RAX asm { MOV[&ans], RAX }
|
|
#define MOV_PARAM0_RDI asm {MOV [¶m0], RDI}
|
|
|
|
I64 param0;
|
|
I64 elf_argc;
|
|
U8** elf_argv;
|
|
|
|
asm {
|
|
_ELF_CALL::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
MOV RAX,U64 SF_ARG1[RBP]
|
|
MOV RDI,U64 SF_ARG2[RBP]
|
|
MOV RSI,U64 SF_ARG3[RBP]
|
|
TEST RAX,RAX
|
|
JZ @@05
|
|
CALL RAX
|
|
@@05: POP RBP
|
|
RET1 8
|
|
}
|
|
|
|
U0 _main()
|
|
{
|
|
MOV_PARAM0_RDI
|
|
CallInd(_ELF_CALL, param0, elf_argc, elf_argv);
|
|
UserTaskCont;
|
|
}
|
|
|
|
//U0 _exit() { UserTaskCont; }
|