just a fun exercise for learning some x86_64 nasm assembly (linux)
Last active
April 17, 2024 20:13
-
-
Save trvswgnr/b77dc5e762062c148cd9e0a378035bba to your computer and use it in GitHub Desktop.
fizzbuzz in nasm assembly
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
section .data | |
fizz_str: db "fizz" ; string for "fizz" | |
buzz_str: db "buzz" ; string for "buzz" | |
newline: db 10 ; ascii value for newline | |
count_to: equ 100 ; count to 100 | |
section .bss | |
num_buffer: resb 3 ; buffer for number | |
section .text | |
global _start | |
_start: | |
xor r8, r8 ; initialize counter to 0 | |
main_loop: | |
inc r8 ; increment counter | |
xor r9, r9 ; initialize flag to 0 | |
mov rdx, 0 ; clear remainder register | |
mov rax, r8 ; copy counter to dividend register | |
mov rcx, 3 ; divisor for fizz | |
div rcx ; divide by 3 | |
cmp rdx, 0 ; check if remainder is 0 | |
jnz check_buzz ; if not, jump to check_buzz | |
or r9, 1 ; if yes, set flag to 1 | |
check_buzz: | |
mov rdx, 0 ; clear remainder register | |
mov rax, r8 ; copy counter to dividend register | |
mov rcx, 5 ; divisor for buzz | |
div rcx ; divide by 5 | |
cmp rdx, 0 ; check if remainder is 0 | |
jnz process_number ; if not, jump to process_number | |
or r9, 2 ; if yes, set flag to 2 | |
process_number: | |
cmp r9, 0 ; check if flag is 0 | |
jnz process_fizz ; if not, jump to process_fizz | |
mov rax, r8 ; copy counter to dividend register | |
call print_number ; call print_number | |
jmp check_end ; jump to check_end | |
process_fizz: | |
cmp r9, 1 ; check if flag is 1 | |
jnz process_buzz ; if not, jump to process_buzz | |
call print_fizz ; call print_fizz | |
jmp check_end ; jump to check_end | |
process_buzz: | |
cmp r9, 2 ; check if flag is 2 | |
jnz process_fizzbuzz ; if not, jump to process_fizzbuzz | |
call print_buzz ; call print_buzz | |
jmp check_end ; jump to check_end | |
process_fizzbuzz: | |
call print_fizzbuzz ; call print_fizzbuzz | |
check_end: | |
cmp r8, count_to ; check if counter reached count_to | |
je exit_program ; if yes, jump to exit_program | |
jmp main_loop ; if not, jump to main_loop | |
print_fizzbuzz: | |
mov rbx, 1 ; set flag to 1 to indicate fizzbuzz | |
jmp print_fizz ; jump to print_fizz | |
print_fizz: | |
xor rbx, rbx ; clear flag | |
print_fizz_continue: | |
mov rax, 1 ; syscall number for write | |
mov rdi, 1 ; file descriptor 1 is stdout | |
mov rsi, fizz_str ; pointer to fizz_str | |
mov rdx, 4 ; string length | |
syscall ; call kernel | |
cmp r9, 3 ; check if flag is 3 (fizzbuzz) | |
jne print_newline ; if not, jump to print_newline | |
jmp print_buzz ; if yes, jump to print_buzz | |
print_buzz: | |
mov rax, 1 ; syscall number for write | |
mov rdi, 1 ; file descriptor 1 is stdout | |
mov rsi, buzz_str ; pointer to buzz_str | |
mov rdx, 4 ; string length | |
syscall ; call kernel | |
jmp print_newline ; jump to print_newline | |
print_newline: | |
mov rax, 1 ; syscall number for write | |
mov rdi, 1 ; file descriptor 1 is stdout | |
mov rsi, newline ; pointer to newline | |
mov rdx, 1 ; string length | |
syscall ; call kernel | |
ret ; return from subroutine | |
print_number: | |
mov r9, 2 ; set flag to 2 | |
convert_to_ascii: | |
mov rdx, 0 ; clear remainder register | |
mov rcx, 10 ; divisor for conversion | |
div rcx ; divide | |
add rdx, 0x30 ; convert to ASCII | |
mov [num_buffer+r9], dl ; store in buffer | |
dec r9 ; decrement flag | |
cmp rax, 0 ; check if dividend is 0 | |
jnz convert_to_ascii ; if not, jump to convert_to_ascii | |
mov rax, 1 ; syscall number for write | |
mov rdi, 1 ; file descriptor 1 is stdout | |
mov rsi, num_buffer ; pointer to num_buffer | |
mov rdx, 3 ; string length | |
syscall ; call kernel | |
call print_newline ; call print_newline | |
ret ; return from subroutine | |
exit_program: | |
mov rax, 60 ; syscall number for exit | |
xor rdi, rdi ; exit code 0 | |
syscall ; call kernel |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment