Created
October 8, 2015 17:10
-
-
Save mchouza/37f9d687495eee94306a to your computer and use it in GitHub Desktop.
FizzBuzz in x86-64 ASM without conditional branches
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; 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