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