//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");