49 lines
821 B
C++
49 lines
821 B
C++
#define RANGE_START 1
|
|
#define RANGE_END 100
|
|
|
|
#define FIZZ_SPAN 6
|
|
#define BUZZ_SPAN 7
|
|
|
|
asm {
|
|
MSG_BUZZ: DU8 "BUZZ\n\0";
|
|
MSG_FIZZ: DU8 "FIZZ\n\0";
|
|
MSG_BUZZ_FIZZ: DU8 "BUZZ_FIZZ\n\0";
|
|
MSG_NEW_LINE: DU8 "\n\0";
|
|
|
|
_BUZZ_FIZZ::
|
|
ENTER 0 //Always use Enter/Leave
|
|
PUSH ESI //RSI must be preserved. This instruction is 64-bit.
|
|
MOV RAX,RANGE_START
|
|
MOV DX,(FIZZ_SPAN-RANGE_START%FIZZ_SPAN+1)<<8+
|
|
(BUZZ_SPAN-RANGE_START%BUZZ_SPAN+1)
|
|
|
|
@@05: DEC DH
|
|
JNZ @@10
|
|
MOV DH,FIZZ_SPAN
|
|
MOV ESI,MSG_FIZZ
|
|
DEC DL
|
|
JNZ @@20
|
|
MOV DL,BUZZ_SPAN
|
|
MOV ESI,MSG_BUZZ_FIZZ
|
|
JMP @@20
|
|
|
|
@@10: DEC DL
|
|
JNZ @@15
|
|
MOV DL,BUZZ_SPAN
|
|
MOV ESI,MSG_BUZZ
|
|
JMP @@20
|
|
|
|
@@15: CALL &PUT_HEX_U64
|
|
MOV ESI,MSG_NEW_LINE
|
|
@@20: CALL &PUT_STR
|
|
|
|
INC RAX
|
|
CMP RAX,RANGE_END //Actually only a 32-bit instruction.
|
|
JBE @@05
|
|
POP ESI
|
|
LEAVE
|
|
RET
|
|
}
|
|
|
|
Call(_BUZZ_FIZZ);
|