53 lines
1.2 KiB
C++
53 lines
1.2 KiB
C++
/*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 $LK,"::/Kernel/StrA.CPP",A="FF:::/Kernel/StrA.CPP,PUT_CHARS"$
|
|
intended to be called from
|
|
asm. Generally, they preserve
|
|
regs.
|
|
|
|
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,R9.
|
|
When calling from the shell or
|
|
from C, preserve all other regs.
|
|
|
|
*/
|
|
|
|
asm {
|
|
//Opcodes are slightly different to make writing my x86_64 assembler easier.
|
|
//See $LK,"::/Compiler/OpCodes.TXT"$.
|
|
|
|
USE64 //Defaults to 64, but this is a good habit.
|
|
|
|
MY_WORLD_MSG:
|
|
//Define U8 does not put terminating zeros
|
|
//on strings.
|
|
DU8 "World\n",0;
|
|
|
|
//My convention is to put an underscore
|
|
//on C callable asm routines.
|
|
_HELLO_WORLD::
|
|
PUSH RSI //See $LK,"REG_VARS_MASK",A="MN:REG_VARS_MASK"$ & $LK,"REG_NON_PTR_MASK",A="MN:REG_NON_PTR_MASK"$
|
|
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_MSG
|
|
CALL PUT_STR
|
|
LOOP @@05
|
|
POP RSI
|
|
RET
|
|
};
|
|
|
|
Call(_HELLO_WORLD);
|