$HL,1$//Press F5 in the editor to compile and run.

--------Hello.CPP.Z---------
"Hello World\n";


--------Hello.CPP.Z---------
U0 Main()
{
  "Hello World\n";
}
Main;


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


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


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


--------Hello.CPP.Z---------
asm {
MSG:	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,MSG
	CALL	PUT_STR
	POP	RSI
	RET
}
Call(_HELLO_WORLD);


--------Hello.CPP.Z---------
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 integer.
	MOV	RAX,'World\n'
	CALL	PUT_CHARS
	RET
}
Call(_HELLO_WORLD);


--------Hello.CPP.Z---------
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.CPP.Z---------
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");
$HL,0$
