//Press F5 in the editor to compile and run.

// --------Hello.ZC--------- //
"Hello World\n";


// --------Hello.ZC--------- //
U0 Main()
{
    "Hello World\n";
}
Main;


// --------Hello.ZC--------- //
U0 MyPrint(U8 *st)
{
    "%s", st;
}
MyPrint("Hello World\n");


// --------Hello.ZC--------- // 
U0 MyPrint2(U8 *st1, U8 *st2) //Any number of args.
{
    "%s %s\n", st1, st2; //Any number of args.
}
MyPrint2("Hello", "World");


// --------Hello.ZC--------- // 
U0 MyPrint(U8 *st)
{
    "" st; //Empty with no comma means first is format str.
}
MyPrint("Hello World\n");


// --------Hello.ZC--------- // 
asm {
MESSAGE:                DU8 "Hello World\n", 0;

//The convention is underscore on C callable.
//Two colons means exported symbol.
_HELLO_WORLD1::
//You can only clobber RAX,RBX,RCX,RDX
                PUSH        RSI
                MOV         RSI, MESSAGE
                CALL        PUT_STR
                POP         RSI
                RET
}
Call(_HELLO_WORLD1);


// --------Hello.ZC--------- //
asm {
_HELLO_WORLD2::
//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_WORLD2);


// --------Hello.ZC--------- //
asm {
_MY_PRINT1::
//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_PRINT1 U0 MyPrint(U8 *st);
MyPrint("Hello World\n");


 // --------Hello.ZC--------- //
asm {
_MY_PRINT2::
//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_PRINT2 U0 MyPrint(U8 *st);
MyPrint("Hello World\n");