asm {
PUT_DEC_U64::
//RAX is number to print in decimal.
//Preserves all regs.
				PUSH		RBP
				MOV 		RBP,RSP
				SUB 		RSP, 24					//24 char buffer on stack

//$LK,"Save regs",A="FF:::/Kernel/KernelA.HH,PUSH_C_REGS"$ which C code is free to clobber.  We don't have to for C callers,
//but this function will be nice for ASM callers if it saves all regs.
				PUSH_C_REGS

				PUSH		RSI 				//See $LK,"REGG_LOCAL_VARS",A="MN:REGG_LOCAL_VARS"$&$LK,"REGG_LOCAL_NON_PTR_VARS",A="MN:REGG_LOCAL_NON_PTR_VARS"$
				LEA 		RSI, -1[RBP] 		//Load addr of end of buffer.
																//We picked RSI because of PUT_STR
																//We'll move backward
				MOV 		U8 [RSI], 0			//Terminator

				TEST		RAX, RAX 			//Special case -- zero
				JNZ 		@@05
				DEC 		RSI
				MOV 		U8 [RSI], '0'
				JMP 		@@15

@@05: 			MOV 		RBX, 10				//Divides by 10

@@10: 			XOR 		RDX, RDX
				DIV 		RBX 				//RAX=(RDX:RAX)/RBX with remainder in RDX
				ADD 		RDX, '0'
				DEC 		RSI
				MOV 		U8 [RSI], DL
				TEST		RAX,RAX
				JNZ 		@@10

@@15: 			CALL		PUT_STR
				POP 		RSI
				POP_C_REGS
				LEAVE
				RET

_DO_IT::		//The convention is C-callable routines have underscores.
				MOV 		RAX, 122333221
				CALL		PUT_DEC_U64
				MOV 		RAX, '\n'
				CALL		PUT_CHARS
				RET
}

Call(_DO_IT);
