forked from zenware/FizzBuzz
-
Notifications
You must be signed in to change notification settings - Fork 0
/
assembly.asm
131 lines (109 loc) · 3.56 KB
/
assembly.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Runs with nasm-2.11.05 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Courtesy - google and my engineering lab work ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; https://github.com/sunnypatel165/BELabCodes/tree/master/Microprocessors ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Thanks! ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;DATA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
section .data
fizz dw "Fizz", 0Ah, 0Dh ;Define Fizz
buzz dw "Buzz", 0Ah, 0Dh ;Define Buzz
fizzbuzz dw "FizzBuzz", 0Ah, 0Dh ;Define FizzBuzz
newLine dw 0Ah, 0Dh ;Define \n
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;TEXT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
section .text
global _start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;INIT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_start:
mov ecx, 1 ;counter=1
loop_main:
push ecx ;counter
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;LOGIC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
xor dx, dx ;reset
mov ax, cx
mov bx, 15
div bx
cmp dx, 0
jz divisible_by_both ;if divisible by both 3 and 5
xor dx, dx ;reset
mov ax, cx
mov bx, 3
div bx
cmp dx, 0
jz divisible_by_three ;if divisible by 3
xor dx, dx ;reset
mov ax, cx
mov bx, 5
div bx
cmp dx, 0
jz divisible_by_five ;if divisible by 5
mov eax, ecx ;eax = number to be printed
call print_num
jmp resume
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;FIZZBUZZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
divisible_by_both:
mov eax, 4 ;System Call
mov ebx, 1
mov ecx, fizzbuzz
mov edx, 10
int 0x80
jmp resume
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;FIZZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
divisible_by_three:
mov eax, 4 ;System Call
mov ebx, 1
mov ecx, fizz
mov edx, 6
int 0x80
jmp resume
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;BUZZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
divisible_by_five:
mov eax, 4 ;System Call
mov ebx, 1
mov ecx, buzz
mov edx, 6
int 0x80
jmp resume
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UTILS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
resume:
pop ecx ;Counter
cmp ecx, 100
jz exit ;loop end
inc ecx ;counter++
jmp loop_main
exit:
mov eax, 1
mov ebx, 0 ;exit(0)
int 0x80
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PRINT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
print_num:
push esi ;save counter
mov esi, 0 ;counter = 0
loop_div: ;loop
mov edx, 0
mov ebx, 10 ;edx = mod 10
div ebx ;eax = dividide by 10
add edx, 48
push edx
inc esi ;counter++
cmp eax, 0
je print_chars ;done loop
jmp loop_div
print_chars:
cmp esi, 0
je done
dec esi ;counter--
mov eax, 4 ;System Call
mov ebx, 1
mov edx, 1
mov ecx, esp
int 0x80
add esp, 4
jmp print_chars
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PRINT\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
done:
mov eax, 4 ;System Call
mov ebx, 1
mov ecx, newLine
mov edx, 1
int 0x80
pop esi ;Counter
ret