-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathUser_Input_Computation.asm
269 lines (204 loc) · 5.99 KB
/
User_Input_Computation.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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
TITLE Program Template (template.asm)
; Author: Haris Hambasic
; Description: This file represents a program that allows the user to enter numbers between -200 and -100 (inclusive), and -50 and -1 (inclusive) and sums the value of the valid inputs while also displaying
; to the user at the end of the program the following:
; 1) The maximum value entered
; 2) The minimum value entered
; 3) The average of the values entered
; 4) The total number of valid numbers entered
INCLUDE Irvine32.inc
; (insert constant definitions here)
rangeALow = -200
rangeAHigh = -100
rangeBHigh = -1
rangeBLow = -50
.data
; (insert variable definitions here)
programTitle BYTE "Program Title: Project 3",0
programmersName BYTE "Programmer's Name: Haris Hambasic",0
greeting BYTE "Hello! Welcome to Project 3!",0
promptUsername BYTE "Please enter your name: ",0
programInstructions BYTE "Program Instructions: Please enter values between -200 and -100 (inclusive), and between -50 and -1 (inclusive)",0
greetUserWithUsername BYTE "Hello, ",0
userName DWORD ?
period BYTE ".",0
userPrompt BYTE "Please enter a number.",0
sum DWORD 0
min DWORD 0
minStatement BYTE "The minimum number entered is ",0
max DWORD -201
maxStatement BYTE "The maximum number entered is ",0
average DWORD 0
averageStatement BYTE "The average of the numbers entered is ",0
totalNumbersEntered DWORD 0
totalNumbersEnteredStatement BYTE " total valid numbers were entered.",0
outOfRangeALow BYTE "The number entered is less than -200.",0
outOfRangeBLow BYTE "The number entered is less than -50 and more than -100.",0
positiveNumberEntered BYTE "You entered a positive number, which now terminates the program. ",0
totalValueStatement BYTE "Your total computed value is: ",0
noValidNumbersEntered BYTE "Oh no! It looks as if you did not enter any valid numbers. Please play again!",0
partingMessage BYTE "Thanks for running my program! I hope to see you soon!",0
.code
main PROC
; (insert executable instructions here)
; Display program title and programmer's name
MOV EDX, OFFSET programTitle
CALL WriteString
MOV EDX, OFFSET programmersName
CALL CrLf
CALL WriteString
CALL CrLf
CALL CrLf
; Get the user's name and greet the user
MOV EDX, OFFSET greeting
CALL WriteString
CALL CrLf
MOV EDX, OFFSET promptUsername
CALL CrLf
CALL WriteString
MOV ECX, 32
CALL ReadString
MOV userName, EDX
MOV EDX, OFFSET greetUserWithUsername
CALL WriteString
MOV EDX, userName
CALL WriteString
CALL CrLf
CALL CrLf
; Display program instructions
MOV EDX, OFFSET programInstructions
CALL WriteString
CALL CrLf
CALL CrLf
JMP _addToTotal?
_validateUserInput:
CMP EAX, 0
JNS _positiveNumberEntered
; Check if entered number is less than -200
CMP EAX, rangeALow
JL _outOfRangeALow
; Check if entered number is less than -100
CMP EAX, rangeAHigh
JLE _addToTotal
; Check if entered number is than -50
CMP EAX, rangeBLow
JL _outOfRangeBLow
; Check if entered number is less than -1
CMP EAX, rangeBHigh
JLE _addToTotal
; Out of range code labels
_outOfRangeALow:
MOV EDX, OFFSET outOfRangeALow
CALL WriteString
CALL CrLf
CALL CrLf
JMP _addToTotal?
_outOfRangeBLow:
MOV EDX, OFFSET outOfRangeBLow
CALL WriteString
CALL CrLf
CALL CrLf
JMP _addToTotal?
_addToTotal?:
MOV EDX, OFFSET userPrompt
CALL WriteString
CALL CrLf
CALL ReadInt
JMP _validateUserInput
; If negative number
JS _addToTotal
; If positive number
JNS _terminateAddToTotal
_addToTotal:
CALL CrLf
ADD totalNumbersEntered, 1
; Set the max value
CMP EAX, max
JG _setMax
; Set the min value
CMP EAX, min
JL _setMin
JMP _updateSum
_updateSum:
ADD EAX, sum
MOV sum, EAX
JMP _addToTotal?
_terminateAddToTotal:
MOV EDX, OFFSET programmersName
CALL WriteString
JMP _endProgram
; Update the max number entered, as needed
_setMax:
MOV max, EAX
JMP _updateSum
; Update the min number entered, as needed
_setMin:
MOV min, EAX
JMP _updateSum
_positiveNumberEntered:
CMP totalNumbersEntered, 0
JE _noValidNumbersEndProgram
CALL CrLf
CALL CrLf
; Inform the user they entered a positive number and the program is now terminating
MOV EDX, OFFSET positiveNumberEntered
CALL WriteString
MOV EDX, OFFSET totalValueStatement
CALL WriteString
MOV EAX, sum
CALL WriteInt
MOV EDX, OFFSET period
CALL WriteString
CALL CrLf
CALL CrLf
; Display the total valid inputs entered by the user
MOV EAX, totalNumbersEntered
CALL WriteInt
MOV EDX, OFFSET totalNumbersEnteredStatement
CALL WriteString
; Compute the average of all numbers entered
CALL CrLf
CALL CrLf
MOV EDX, OFFSET averageStatement
CALL WriteString
CALL CrLf
CALL CrLf
; Display the minimum number inputted
mov EDX, OFFSET minStatement
CALL WriteString
MOV EAX, min
CALL WriteInt
MOV EDX, OFFSET period
CALL WriteString
CALL CrLf
CALL CrLf
; Display the maximum number inputted
MOV EDX, OFFSET maxStatement
CALL WriteString
MOV EAX, max
CALL WriteInt
MOV EDX, OFFSET period
CALL WriteString
CALL CrLf
CALL CrLf
CALL CrLf
CALL CrLf
; Display a parting message to the user
MOV EDX, OFFSET partingMessage
CALL WriteString
JMP _endProgram
; Code label for when an instance of the program is executed without the user entering any valid inputs
_noValidNumbersEndProgram:
CALL CrLf
CALL CrLf
MOV EDX, OFFSET noValidNumbersEntered
CALL WriteString
CALL CrLf
CALL CrLf
; Add white space below program output
_endProgram:
CALL CrLf
CALL CrLf
Invoke ExitProcess,0 ; exit to operating system
main ENDP
END main