//Press F5 in the editor to compile and run. --------Hello.CC--------- "Hello World\n"; --------Hello.CC--------- U0 Main() { "Hello World\n"; } Main; --------Hello.CC--------- U0 MyPrint(U8 *st) { "%s", st; } MyPrint("Hello World\n"); --------Hello.CC--------- U0 MyPrint2(U8 *st1, U8 *st2) //Any number of args. { "%s %s\n", st1, st2; //Any number of args. } MyPrint2("Hello", "World"); --------Hello.CC--------- U0 MyPrint(U8 *st) { "" st; //Empty with no comma means first is format str. } MyPrint("Hello World\n"); --------Hello.CC--------- asm { MESSAGE: DU8 "Hello World\n", 0; //The convention is underscore on C callable. //Two colons means exported symbol. _HELLO_WORLD:: //You can only clobber RAX,RBX,RCX,RDX PUSH RSI MOV RSI, MESSAGE CALL PUT_STR POP RSI RET } Call(_HELLO_WORLD); --------Hello.CC--------- asm { _HELLO_WORLD:: //You can only clobber RAX,RBX,RCX,RDX MOV RAX, 'Hello ' CALL PUT_CHARS //Up to 8 chars packed into one 64-bit int. MOV RAX, 'World\n' CALL PUT_CHARS RET } Call(_HELLO_WORLD); --------Hello.CC--------- asm { _MY_PRINT:: //You can only clobber RAX,RBX,RCX,RDX PUSH RBP MOV RBP, RSP PUSH RSI MOV RSI, U64 SF_ARG1[RBP] CALL PUT_STR POP RSI POP RBP RET1 8 //Callee pops the stack to clear args. } _extern _MY_PRINT U0 MyPrint(U8 *st); MyPrint("Hello World\n"); --------Hello.CC--------- asm { _MY_PRINT:: //You can only clobber RAX,RBX,RCX,RDX PUSH RBP MOV RBP, RSP PUSH U64 SF_ARG1[RBP] CALL &PutS //Callee pops the stack to clear args. POP RBP RET1 8 } _extern _MY_PRINT U0 MyPrint(U8 *st); MyPrint("Hello World\n");