/*Asm labels can only be defined once
in a task.  <F5> will spawn a new task
each time, so you don't get redefine
error, like when repeatedly #including
it from the cmd line.

These are many useful kernel
routines ::/Kernel/StrA.ZC
intended to be called from
asm. Generally, they
preserve registers.

You can call any routine you
like, C or asm, if you import it.
Be aware that C routines do not
preserve RAX, RBX, RCX, RDX, R8, or R9.
When calling from the shell or
from C, preserve all other registers.

*/

asm {
//Opcodes are slightly different to make writing the x86_64 assembler easier.
//See ::/Compiler/OpCodes.DD.

MY_WORLD_MESSAGE:
//Define U8 does not put terminating zeros
//on strings.
                DU8         "World\n", 0;

//The convention is to put an underscore
//on C callable asm routines.
_HELLO_WORLD::
                PUSH        RSI             //See REGG_LOCAL_VARS & REGG_LOCAL_NON_PTR_VARS
                MOV         RCX, 10
@@05:           MOV         RAX, RCX
                CALL        PUT_HEX_U8
                MOV         RAX, CH_SPACE
                CALL        PUT_CHARS
                MOV         RAX, 'Hello '   //Supports multi-byte char consts
                CALL        PUT_CHARS
//We broke it in two pieces to show different ways.
                MOV         RSI, MY_WORLD_MESSAGE
                CALL        PUT_STR
                LOOP        @@05
                POP         RSI
                RET
};

Call(_HELLO_WORLD);