On Wednesday, July 18, 2018 at 7:57:25 AM UTC-5, Rick C. Hodgin wrote:
> Many Usenet users tell you to always post here as it leaves a
> permanent record.
###############################################################################
.set SYS_EXIT, 60
.set SYS_WRITE, 1
.set STDIN, 0
.set STDOUT, 1
.set STDERR, 2
.set ITERATIONS, 1000000
###############################################################################
.data
.lcomm OutputBuffer, ITERATIONS*9
Fizz:
.ascii "Fizz\n "
Buzz:
.ascii "Buzz\n "
FizzBuzz:
.ascii "FizzBuzz\n "
FirstNum:
.ascii "0\n "
Str100p:
.word 0x3030, 0x3130, 0x3230, 0x3330, 0x3430, 0x3530, 0x3630, 0x3730, 0x3830, 0x3930
.word 0x3031, 0x3131, 0x3231, 0x3331, 0x3431, 0x3531, 0x3631, 0x3731, 0x3831, 0x3931
.word 0x3032, 0x3132, 0x3232, 0x3332, 0x3432, 0x3532, 0x3632, 0x3732, 0x3832, 0x3932
.word 0x3033, 0x3133, 0x3233, 0x3333, 0x3433, 0x3533, 0x3633, 0x3733, 0x3833, 0x3933
.word 0x3034, 0x3134, 0x3234, 0x3334, 0x3434, 0x3534, 0x3634, 0x3734, 0x3834, 0x3934
.word 0x3035, 0x3135, 0x3235, 0x3335, 0x3435, 0x3535, 0x3635, 0x3735, 0x3835, 0x3935
.word 0x3036, 0x3136, 0x3236, 0x3336, 0x3436, 0x3536, 0x3636, 0x3736, 0x3836, 0x3936
.word 0x3037, 0x3137, 0x3237, 0x3337, 0x3437, 0x3537, 0x3637, 0x3737, 0x3837, 0x3937
.word 0x3038, 0x3138, 0x3238, 0x3338, 0x3438, 0x3538, 0x3638, 0x3738, 0x3838, 0x3938
.word 0x3039, 0x3139, 0x3239, 0x3339, 0x3439, 0x3539, 0x3639, 0x3739, 0x3839, 0x3939
###############################################################################
.text
.globl start
.globl _main
.p2align 4, 0x90
start:
_main:
Initializing:
xorl %r12d, %r12d # counter
leaq OutputBuffer(%rip), %rdi # output buffer pointer
incq %rdi
movq Fizz(%rip), %r9
movq Buzz(%rip), %r10
movq FizzBuzz(%rip), %r11
leaq Str100p(%rip), %rsp # Str100p tasile pointer
movq FirstNum(%rip), %rsi
movq $2, %r13
xorl %ecx, %ecx
jmp mod_01
.p2align 4, 0x90
mod_00:
incq %r12 # increase counter
movl %r12d, %eax
movl $0xA, %esi # accumulator
xorl %ecx, %ecx
xorl %r13d, %r13d # counter
incb %r13b
.p2align 4, 0x90
1:
movslq %eax, %rax
imulq $1374389535, %rax, %rdx # magic number 0x51EB851F
movq %rdx, %rbx
shrq $63, %rbx
sarq $37, %rdx
addl %ebx, %edx
imull $100, %edx, %ebx # %rax = 1234567, %rbx = 1234500, %rdx = 12345
subl %ebx, %eax
xchgl %edx, %eax
testl %eax, %eax
jz 2f
shlq $16, %rsi
movw (%rsp, %rdx, 2), %si
addb $2, %r13b
jmp 1b
2:
shlq $16, %rsi
movw (%rsp, %rdx, 2), %si
cmpb $0x30, %sil
jne 3f
decb %r13b
shrq $8, %rsi
3:
movb %r13b, %cl
shlb $3, %cl
addb $2, %r13b
movq %r11, (%rdi) # print FizzBuzz
addq $9, %rdi
movb $0xA, -1(%rdi)
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_01:
incq %r12
xorl %eax, %eax
incb %al
shlq %cl, %rax
addq %rax, %rsi
movq %rsi, (%rdi) # emulate number
addq %r13, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_02:
incq %r12
xorl %eax, %eax
incb %al
shlq %cl, %rax
addq %rax, %rsi
movq %rsi, (%rdi) # emulate number
addq %r13, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_03:
incq %r12
movq %r9, (%rdi) # print Fizz
addq $5, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_04:
incq %r12
xorl %eax, %eax
addb $2, %al
shlq %cl, %rax
addq %rax, %rsi
movq %rsi, (%rdi) # emulate number
addq %r13, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_05:
incq %r12
movq %r10, (%rdi) # print Buzz
addq $5, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_06:
incq %r12
movq %r9, (%rdi) # print Fizz
addq $5, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_07:
incq %r12
xorl %eax, %eax
addb $3, %al
shlq %cl, %rax
addq %rax, %rsi
movq %rsi, (%rdi) # emulate number
addq %r13, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_08:
incq %r12
xorl %eax, %eax
incb %al
shlq %cl, %rax
addq %rax, %rsi
movq %rsi, (%rdi) # emulate number
addq %r13, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_09:
incq %r12
movq %r9, (%rdi) # print Fizz
addq $5, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_10:
incq %r12 # increase counter
movl %r12d, %eax
movl $0xA, %esi # accumulator
xorl %ecx, %ecx
xorl %r13d, %r13d # counter
incb %r13b
.p2align 4, 0x90
1:
movslq %eax, %rax
imulq $1374389535, %rax, %rdx # magic number 0x51EB851F
movq %rdx, %rbx
shrq $63, %rbx
sarq $37, %rdx
addl %ebx, %edx
imull $100, %edx, %ebx # %rax = 1234567, %rbx = 1234500, %rdx = 12345
subl %ebx, %eax
xchgl %edx, %eax
testl %eax, %eax
jz 2f
shlq $16, %rsi
movw (%rsp, %rdx, 2), %si
addb $2, %r13b
jmp 1b
2:
shlq $16, %rsi
movw (%rsp, %rdx, 2), %si
cmpb $0x30, %sil
jne 3f
decb %r13b
shrq $8, %rsi
3:
movb %r13b, %cl
shlb $3, %cl
addb $2, %r13b
movq %r10, (%rdi) # print Buzz
addq $5, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_11:
incq %r12
xorl %eax, %eax
incb %al
shlq %cl, %rax
addq %rax, %rsi
movq %rsi, (%rdi) # emulate number
addq %r13, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_12:
incq %r12
movq %r9, (%rdi) # print Fizz
addq $5, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_13:
incq %r12
xorl %eax, %eax
addb $2, %al
shlq %cl, %rax
addq %rax, %rsi
movq %rsi, (%rdi) # emulate number
addq %r13, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_14:
incq %r12
xorl %eax, %eax
incb %al
shlq %cl, %rax
addq %rax, %rsi
movq %rsi, (%rdi) # emulate number
addq %r13, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_15:
incq %r12
movq %r11, (%rdi) # print FizzBuzz
addq $9, %rdi
movb $0xA, -1(%rdi)
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_16:
incq %r12
xorl %eax, %eax
addb $2, %al
shlq %cl, %rax
addq %rax, %rsi
movq %rsi, (%rdi) # emulate number
addq %r13, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_17:
incq %r12
xorl %eax, %eax
incb %al
shlq %cl, %rax
addq %rax, %rsi
movq %rsi, (%rdi) # emulate number
addq %r13, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_18:
incq %r12
movq %r9, (%rdi) # print Fizz
addq $5, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_19:
incq %r12
xorl %eax, %eax
addb $2, %al
shlq %cl, %rax
addq %rax, %rsi
movq %rsi, (%rdi) # emulate number
addq %r13, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_20:
incq %r12 # increase counter
movl %r12d, %eax
movl $0xA, %esi # accumulator
xorl %ecx, %ecx
xorl %r13d, %r13d # counter
incb %r13b
.p2align 4, 0x90
1:
movslq %eax, %rax
imulq $1374389535, %rax, %rdx # magic number 0x51EB851F
movq %rdx, %rbx
shrq $63, %rbx
sarq $37, %rdx
addl %ebx, %edx
imull $100, %edx, %ebx # %rax = 1234567, %rbx = 1234500, %rdx = 12345
subl %ebx, %eax
xchgl %edx, %eax
testl %eax, %eax
jz 2f
shlq $16, %rsi
movw (%rsp, %rdx, 2), %si
addb $2, %r13b
jmp 1b
2:
shlq $16, %rsi
movw (%rsp, %rdx, 2), %si
cmpb $0x30, %sil
jne 3f
decb %r13b
shrq $8, %rsi
3:
movb %r13b, %cl
shlb $3, %cl
addb $2, %r13b
movq %r10, (%rdi) # print Buzz
addq $5, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_21:
incq %r12
movq %r9, (%rdi) # print Fizz
addq $5, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_22:
incq %r12
xorl %eax, %eax
addb $2, %al
shlq %cl, %rax
addq %rax, %rsi
movq %rsi, (%rdi) # emulate number
addq %r13, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_23:
incq %r12
xorl %eax, %eax
incb %al
shlq %cl, %rax
addq %rax, %rsi
movq %rsi, (%rdi) # emulate number
addq %r13, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_24:
incq %r12
movq %r9, (%rdi) # print Fizz
addq $5, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_25:
incq %r12
movq %r10, (%rdi) # print Buzz
addq $5, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_26:
incq %r12
xorl %eax, %eax
addb $3, %al
shlq %cl, %rax
addq %rax, %rsi
movq %rsi, (%rdi) # emulate number
addq %r13, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_27:
incq %r12
movq %r9, (%rdi) # print Fizz
addq $5, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_28:
incq %r12
xorl %eax, %eax
addb $2, %al
shlq %cl, %rax
addq %rax, %rsi
movq %rsi, (%rdi) # emulate number
addq %r13, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
mod_29:
incq %r12
xorl %eax, %eax
incb %al
shlq %cl, %rax
addq %rax, %rsi
movq %rsi, (%rdi) # emulate number
addq %r13, %rdi
cmpq $ITERATIONS, %r12
jae PrintBuffer
jmp mod_00
.p2align 4, 0x90
PrintBuffer:
movq %rdi, %rdx
leaq OutputBuffer(%rip), %rsi
incq %rsi
subq %rsi, %rdx # number of symbols
movl $STDOUT, %edi
movl $SYS_WRITE, %eax
syscall
Exit:
xorl %edi, %edi