Interview like it's the 90's... (FizzBuzz in 32-bit x86 Assembly)
0
fizzbuzz.asm
134 lines 2.3 kB view raw
1; Compile and execute with: 2; $ cat > main.c << EOF 3; int asm_main(); 4; int main() { return asm_main(); } 5; EOF 6; $ nasm -f elf fizzbuzz.asm && gcc -m32 -Wall -o fizzbuzz main.c fizzbuzz.o && ./fizzbuzz 7; 8 9%define MAX_ITER 100 10 11segment .data 12 Fizz db "Fizz", 0 13 Buzz db "Buzz", 0 14 15segment .text 16global asm_main 17 18asm_main: 19 enter 0,0 20 push ebx 21 22 mov ecx, MAX_ITER ; initialize loop counter 23 dec ecx ; skip zero iteration 24 25Fizz_Loop: 26 mov eax, MAX_ITER 27 sub eax, ecx ; current iteration: MAX_ITER - loop count 28 29 xor ebx, ebx ; clear ebx 30 xor edx, edx ; clear edx 31 32 push ebx 33 mov ebx, 3 34 div ebx ; edx = edx:eax % 3 35 pop ebx 36 37 cmp edx, 0 38 jne No_Fizz 39 inc ebx ; indicate Fizz usage 40 mov eax, Fizz 41 call print_string 42 43No_Fizz: 44 mov eax, MAX_ITER 45 sub eax, ecx ; current iteration: MAX_ITER - loop count 46 47 xor edx, edx ; clear edx 48 49 push ebx 50 mov ebx, 5 51 div ebx ; edx = edx:eax % 5 52 pop ebx 53 54 cmp edx, 0 55 jne No_Buzz 56 inc ebx ; indicate Buzz usage 57 mov eax, Buzz 58 call print_string 59 60No_Buzz: 61 cmp ebx, 0 62 jne Got_Fizzed_or_Buzzed 63 mov eax, MAX_ITER 64 sub eax, ecx ; current iteration: MAX_ITER - loop count 65 call print_int 66 67Got_Fizzed_or_Buzzed: 68 call print_nl 69 loop Fizz_Loop 70 71 mov eax, 0 72 73 pop ebx 74 leave 75 ret 76 77; 78; Various output helpers using C library printf, putchar functions 79; 80 81%define NL 10 ; 10 == ASCII code for \n 82 83segment .data 84 int_format db "%i", 0 85 string_format db "%s", 0 86 87segment .text 88extern printf, putchar 89 90print_int: 91 enter 0,0 92 pusha 93 pushf 94 95 push eax 96 push dword int_format 97 call printf 98 pop ecx 99 pop ecx 100 101 popf 102 popa 103 leave 104 ret 105 106print_nl: 107 enter 0,0 108 pusha 109 pushf 110 111 push NL 112 call putchar 113 pop ecx 114 115 popf 116 popa 117 leave 118 ret 119 120print_string: 121 enter 0,0 122 pusha 123 pushf 124 125 push eax 126 push dword string_format 127 call printf 128 pop ecx 129 pop ecx 130 131 popf 132 popa 133 leave 134 ret