Skip to content

Instantly share code, notes, and snippets.

@mchouza
Created October 8, 2015 17:10
Show Gist options
  • Save mchouza/37f9d687495eee94306a to your computer and use it in GitHub Desktop.
Save mchouza/37f9d687495eee94306a to your computer and use it in GitHub Desktop.
FizzBuzz in x86-64 ASM without conditional branches
;; FizzBuzz in x86-64 ASM without conditional branches
section .data
fizz: db 'Fizz'
buzz: db 'Buzz'
nl: db 10
section .bss
digits: resb 2
section .text
global _start
_start:
mov rbx, 1
main_loop:
; if ( rbx > 100 )
; exit( 0 )
; else
; write( 1, digits, 0 )
mov rax, rbx
neg rax
add rax, 100
sar rax, 63
mov rdi, rax
and rax, 59
inc rax
neg rdi
mov rsi, digits
xor rdx, rdx
syscall
; r8 <- rbx % 3 != 0 ? -1 : 0
; r9 <- rbx % 5 != 0 ? -1 : 0
mov rax, rbx
mov rcx, 3
div rcx
mov r8, rdx
neg r8
sar r8, 63
mov rax, rbx
mov rcx, 5
xor rdx, rdx
div rcx
mov r9, rdx
neg r9
sar r9, 63
; rcx <- digits
; *rcx = rbx / 10 + '0'
; rcx += ( rbx >= 10 )
; *rcx = rbx % 10 + '0'
; rcx++
mov rcx, digits
mov rax, rbx
xor rdx, rdx
mov rdi, 10
div rdi
mov rsi, rax
add rax, '0'
mov [rcx], rax
neg rsi
sar rsi, 63
neg rsi
add rcx, rsi
add rdx, '0'
mov [rcx], rdx
inc rcx
; write( 1, digits, ( rbx % 3 != 0 && rbx % 5 != 0 ) ? rcx - digits : 0 )
mov rax, 1
mov rdi, 1
mov rsi, digits
mov rdx, rcx
sub rdx, digits
and rdx, r8
and rdx, r9
syscall
; write( 1, fizz, rbx % 3 == 0 ? 4 : 0 )
mov rax, 1
mov rdi, 1
mov rsi, fizz
mov rdx, r8
not rdx
and rdx, 4
syscall
; write( 1, buzz, rbx % 5 == 0 ? 4 : 0 )
mov rax, 1
mov rdi, 1
mov rsi, buzz
mov rdx, r9
not rdx
and rdx, 4
syscall
; write( 1, nl, 1 )
mov rax, 1
mov rdi, 1
mov rsi, nl
mov rdx, 1
syscall
inc rbx
jmp main_loop
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment