1 BITS 32
2
3 section .data
4 00000000 20202020 Spaces: db 32,32,32,32
5 section .bss
6
7 00000000 <res 00000004> fahr: resd 1
8 00000004 <res 00000004> cels: resd 1
9 00000008 <res 00000004> current: resd 1
10 0000000C <res 00000004> upper: resd 1
11 00000010 <res 00000004> step: resd 1
12 00000014 <res 00000004> print: resd 1
13 00000018 <res 00000004> ncels: resd 1
14 0000001C <res 00000004> nfahr: resd 1
15 section .text
16 global _start
17 _start:
18 Initalize:
19 00000000 B89CFFFFFF mov eax,-100
20 00000005 A3[00000000] mov [fahr],eax
21 0000000A A3[08000000] mov [current],eax
22 0000000F B814000000 mov eax,20
23 00000014 A3[10000000] mov [step],eax
24 00000019 B8C8000000 mov eax,200
25 0000001E A3[0C000000] mov [upper],eax
26 PrimaryLoop:
27 00000023 B800000000 mov eax,0
28 00000028 A3[18000000] mov [ncels],eax
29 0000002D A3[1C000000] mov [nfahr],eax
30 00000032 A1[08000000] mov eax,[current]
31 00000037 A3[00000000] mov [fahr],eax
32 0000003C A1[00000000] mov eax,[fahr]
33 00000041 8B1D[0C000000] mov ebx,[upper]
34 00000047 39D8 cmp eax,ebx
35 00000049 0F8FF6010000 jg Terminate
36 DoMath:
37 0000004F A1[00000000] mov eax,[fahr]
38 00000054 BB20000000 mov ebx,32
39 00000059 29D8 sub eax,ebx
40 0000005B BB05000000 mov ebx,5
41 00000060 0FAFC3 imul eax,ebx
42 00000063 B909000000 mov ecx,9
43 00000068 BA00000000 mov edx,0
44 0000006D 99 cdq
45 0000006E F7F9 idiv ecx
46 00000070 A3[04000000] mov [cels],eax
47 InsertStackMarker:
48 00000075 B810270000 mov eax,10000
49 0000007A 50 push eax
50 CheckIfCelsIsNegative:
51 0000007B A1[04000000] mov eax,[cels]
52 00000080 BB00000000 mov ebx,0
53 00000085 39D8 cmp eax,ebx
54 00000087 7C02 jl CelsIsNegative
55 00000089 EB1C jmp PushCelsDigitsToStack
56 CelsIsNegative:
57 0000008B B801000000 mov eax,1
58 00000090 A3[18000000] mov [ncels],eax
59 00000095 A1[04000000] mov eax,[cels]
60 0000009A BBFFFFFFFF mov ebx,-1
61 0000009F 0FAFC3 imul eax,ebx
62 000000A2 A3[04000000] mov [cels],eax
63 PushCelsDigitsToStack:
64 000000A7 A1[04000000] mov eax,[cels]
65 000000AC BB00000000 mov ebx,0
66 000000B1 39D8 cmp eax,ebx
67 000000B3 7415 je GotAZero
68 000000B5 B90A000000 mov ecx,10
69 000000BA BA00000000 mov edx,0
70 000000BF 99 cdq
71 000000C0 F7F9 idiv ecx
72 000000C2 52 push edx
73 000000C3 A3[04000000] mov [cels],eax
74 000000C8 EBDD jmp PushCelsDigitsToStack
75 GotAZero:
76 000000CA 5B pop ebx
77 000000CB 39D8 cmp eax,ebx
78 000000CD 7414 je JustAZero
79 000000CF 53 push ebx
80 000000D0 B810270000 mov eax,10000
81 000000D5 39D8 cmp eax,ebx
82 000000D7 7402 je ActualZero
83 000000D9 EB0E jmp DecideSign
84 ActualZero:
85 000000DB B800000000 mov eax,0
86 000000E0 50 push eax
87 000000E1 EBC4 jmp PushCelsDigitsToStack
88 JustAZero:
89 000000E3 B800000000 mov eax,0
90 000000E8 50 push eax
91 DecideSign:
92 000000E9 A1[18000000] mov eax,[ncels]
93 000000EE BB01000000 mov ebx,1
94 000000F3 39D8 cmp eax,ebx
95 000000F5 7402 je InsertSign
96 000000F7 EB0D jmp InsertAnotherStackMarker
97 InsertSign:
98 000000F9 B82D000000 mov eax,45
99 000000FE BB30000000 mov ebx,30h
100 00000103 29D8 sub eax,ebx
101 00000105 50 push eax
102 InsertAnotherStackMarker:
103 00000106 B810270000 mov eax,10000
104 0000010B 50 push eax
105 CheckIfFahrIsNegative:
106 0000010C A1[00000000] mov eax,[fahr]
107 00000111 BB00000000 mov ebx,0
108 00000116 39D8 cmp eax,ebx
109 00000118 7C02 jl FahrIsNegative
110 0000011A EB1C jmp PushFahrDigitsToStack
111 FahrIsNegative:
112 0000011C B801000000 mov eax,1
113 00000121 A3[1C000000] mov [nfahr],eax
114 00000126 A1[00000000] mov eax,[fahr]
115 0000012B BBFFFFFFFF mov ebx,-1
116 00000130 0FAFC3 imul eax,ebx
117 00000133 A3[00000000] mov [fahr],eax
118 PushFahrDigitsToStack:
119 00000138 A1[00000000] mov eax,[fahr]
120 0000013D BB00000000 mov ebx,0
121 00000142 39D8 cmp eax,ebx
122 00000144 7415 je GotADifferentZero
123 00000146 B90A000000 mov ecx,10
124 0000014B BA00000000 mov edx,0
125 00000150 99 cdq
126 00000151 F7F9 idiv ecx
127 00000153 52 push edx
128 00000154 A3[00000000] mov [fahr],eax
129 00000159 EBDD jmp PushFahrDigitsToStack
130 ;;;;Something feels really wrong about GotADifferentZero...
131 GotADifferentZero:
132 0000015B 5B pop ebx
133 0000015C 39D8 cmp eax,ebx
134 0000015E 7414 je JustADifferentZero
135 00000160 53 push ebx
136 00000161 B810270000 mov eax,10000
137 00000166 39D8 cmp eax,ebx
138 00000168 7402 je AnotherActualZero
139 0000016A EB0E jmp DecideAnotherSign
140 AnotherActualZero:
141 0000016C B800000000 mov eax,0
142 00000171 50 push eax
143 00000172 EBC4 jmp PushFahrDigitsToStack
144 JustADifferentZero:
145 00000174 B800000000 mov eax,0
146 00000179 50 push eax
147 DecideAnotherSign:
148 0000017A A1[1C000000] mov eax,[nfahr]
149 0000017F BB01000000 mov ebx,1
150 00000184 39D8 cmp eax,ebx
151 00000186 7402 je InsertAnotherSign
152 00000188 EB0D jmp PrintFahrFromStack
153 InsertAnotherSign:
154 0000018A B82D000000 mov eax,45
155 0000018F BB30000000 mov ebx,30h
156 00000194 29D8 sub eax,ebx
157 00000196 50 push eax
158 PrintFahrFromStack:
159 00000197 B810270000 mov eax,10000
160 0000019C 5B pop ebx
161 0000019D 39D8 cmp eax,ebx
162 0000019F 7424 je PrintWhitespace
163 000001A1 B830000000 mov eax,30h
164 000001A6 01D8 add eax,ebx
165 000001A8 A3[14000000] mov [print],eax
166 000001AD B804000000 mov eax,4
167 000001B2 BB01000000 mov ebx,1
168 000001B7 B9[14000000] mov ecx,print
169 000001BC BA01000000 mov edx,1
170 000001C1 CD80 int 80h
171 000001C3 EBD2 jmp PrintFahrFromStack
172 PrintWhitespace:
173 000001C5 B804000000 mov eax,4
174 000001CA BB01000000 mov ebx,1
175 000001CF B9[00000000] mov ecx,Spaces
176 000001D4 BA04000000 mov edx,4
177 000001D9 CD80 int 80h
178 PrintCelsFromStack:
179 000001DB B810270000 mov eax,10000
180 000001E0 5B pop ebx
181 000001E1 39D8 cmp eax,ebx
182 000001E3 7424 je IncrementFahr
183 000001E5 B830000000 mov eax,30h
184 000001EA 01D8 add eax,ebx
185 000001EC A3[14000000] mov [print],eax
186 000001F1 B804000000 mov eax,4
187 000001F6 BB01000000 mov ebx,1
188 000001FB B9[14000000] mov ecx,print
189 00000200 BA01000000 mov edx,1
190 00000205 CD80 int 80h
191 00000207 EBD2 jmp PrintCelsFromStack
192 IncrementFahr:
193 00000209 A1[08000000] mov eax,[current]
194 0000020E 8B1D[10000000] mov ebx,[step]
195 00000214 01D8 add eax,ebx
196 00000216 A3[00000000] mov [fahr],eax
197 0000021B A3[08000000] mov [current],eax
198 00000220 B80A000000 mov eax,10
199 00000225 A3[14000000] mov [print],eax
200 0000022A B804000000 mov eax,4
201 0000022F BB01000000 mov ebx,1
202 00000234 B9[14000000] mov ecx,print
203 00000239 BA01000000 mov edx,1
204 0000023E CD80 int 80h
205 00000240 E9DEFDFFFF jmp PrimaryLoop
206 Terminate:
207 00000245 B801000000 mov eax,1
208 0000024A BB00000000 mov ebx,0
209 0000024F CD80 int 80h
Output:
-100 -73
-80 -62
-60 -51
-40 -40
-20 -28
0 -17
20 -6
40 4
60 15
80 26
100 37
120 48
140 60
160 71
180 82
200 93
Comments