Interview like it's the 90's... (FizzBuzz in 32-bit x86 Assembly)
0
fizzbuzz.asm
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