Okay so far my code asks for user inputs and contains the procedures for additio
ID: 3534378 • Letter: O
Question
Okay so far my code asks for user inputs and contains the procedures for addition, subtraction, multiplication and division. Please help me fix the errors in my code. Also i need to implement this:
INCLUDE Irvine32.inc
COUNT 2
.data
str1 Byte " Enter a 32-bit signed integer: ",0
str2 Byte "You entered: ",0dh,0ah,0
str3 Byte " The sum of your two numbers is: ", 0dh,0ah,0
array SDWORD COUNT DUP (?)
.code
main PROC
; Input numbers from user
mov ecx, COUNT
mov edx, OFFSET str1
mov esi, OFFSET array
L1: call WriteString ; display prompt
call ReadInt ; read int from user
mov [esi],eax ; store in array
add esi,TYPE array ; next array position
loop L1
call Crlf ;end of line
mov edx,OFFSET str2 ; Redisplay the integers
call WriteString
mov ecx,COUNT
mov esi,OFFSET array
L2: mov eax,[esi] ; get integer from array
call WriteInt ; display it
call Crlf
add esi,TYPE array ; next array position
loop L2
ArraySum PROC
mov ebx,0 ; set the sum to zero
mov ecx,LENGTHOF myarray ; set number of elements
L3: add ebx,myArray[esi] ; add each integer to sum
loop L1 ; repeat for array size
mov theSum,eax ; store the sum
call Crlf ;end of line
mov edx,OFFSET str3 ; Redisplay the Sum
call WriteString
call Writeint
ret
ArraySum ENDP
ArrayDifference PROC
mov ebx,0 ; set the difference to zero
mov ecx,LENGTHOF myarray ; set number of elements
L4: sub ebx,myArray[esi] ; subtract each integer to sum
loop L1 ; repeat for array size
mov theDiff,eax ; store the difference
call Crlf ;end of line
mov edx,OFFSET str3 ; Redisplay the Difference
call WriteString
call Writeint
ret
ArrayDifference ENDP
ArrayMultiplication PROC
mov ebx,0 ; set the difference to zero
mov ecx,LENGTHOF myarray ; set number of elements
L5: imul ebx,myArray[esi] ; multiply each integer to sum
loop L1 ; repeat for array size
mov theProd,eax ; store the product
call Crlf ;end of line
mov edx,OFFSET str3 ; Redisplay the Product
call WriteString
call Writeint
ret
ArrayMultiplication ENDP
ArrayDivision PROC
mov ebx,0 ; set the difference to zero
mov ecx,LENGTHOF myarray ; set number of elements
L6: div ebx,myArray[esi] ; Divide each integer to sum
loop L1 ; repeat for array size
mov theQuotient,eax ; store the Quotient
call Crlf ;end of line
mov edx,OFFSET str3 ; Redisplay the Quotient
call WriteString
call Writeint
ret
ArrayDivision ENDP
Explanation / Answer
How about a working one :)
Here it is
section .data
; Messages
msg1 db 10,'-Calculator-',10,0
lmsg1 equ $ - msg1
msg2 db 10,'Number 1: ',0
lmsg2 equ $ - msg2
msg3 db 'Number 2: ',0
lmsg3 equ $ - msg3
msg4 db 10,'1. Add',10,0
lmsg4 equ $ - msg4
msg5 db '2. Subtract',10,0
lmsg5 equ $ - msg5
msg6 db '3. Multiply',10,0
lmsg6 equ $ - msg6
msg7 db '4. Divide',10,0
lmsg7 equ $ - msg7
msg8 db 'Operation: ',0
lmsg8 equ $ - msg8
msg9 db 10,'Result: ',0
lmsg9 equ $ - msg9
msg10 db 10,'Invalid Option',10,0
lmsg10 equ $ - msg10
nlinea db 10,10,0
lnlinea equ $ - nlinea
section .bss
; Spaces reserved for storing the values ??provided by the user.
opc: resb 2
num1: resb 2
num2: resb 2
result: resb 2
section .text
global _start
_start:
; Print on screen the message 1
mov eax, 4
mov ebx, 1
mov ecx, msg1
mov edx, lmsg1
int 80h
; Print on screen the message 2
mov eax, 4
mov ebx, 1
mov ecx, msg2
mov edx, lmsg2
int 80h
; We get num1 value.
mov eax, 3
mov ebx, 0
mov ecx, num1
mov edx, 2
int 80h
; Print on screen the message 3
mov eax, 4
mov ebx, 1
mov ecx, msg3
mov edx, lmsg3
int 80h
; We get num2 value.
mov eax, 3
mov ebx, 0
mov ecx, num2
mov edx, 2
int 80h
; Print on screen the message 4
mov eax, 4
mov ebx, 1
mov ecx, msg4
mov edx, lmsg4
int 80h
; Print on screen the message 5
mov eax, 4
mov ebx, 1
mov ecx, msg5
mov edx, lmsg5
int 80h
; Print on screen the message 6
mov eax, 4
mov ebx, 1
mov ecx, msg6
mov edx, lmsg6
int 80h
; Print on screen the message 7
mov eax, 4
mov ebx, 1
mov ecx, msg7
mov edx, lmsg7
int 80h
; Print on screen the message 8
mov eax, 4
mov ebx, 1
mov ecx, msg8
mov edx, lmsg8
int 80h
; We get the option selected.
mov ebx,0
mov ecx,opc
mov edx,2
mov eax,3
int 80h
mov ah, [opc] ; Move the selected option to the registry ah
sub ah, '0' ; Convert from ascii to decimal
; We compare the value entered by the user to know what operation to perform.
cmp ah, 1
je add
cmp ah, 2
je subtract
cmp ah, 3
je multiply
cmp ah, 4
je divide
; If the value entered by the user does not meet any of the above
; conditions then we show an error message and we close the program.
mov eax, 4
mov ebx, 1
mov ecx, msg10
mov edx, lmsg10
int 80h
jmp exit
add:
; We keep the numbers in the registers al and bl
mov al, [num1]
mov bl, [num2]
; Convert from ascii to decimal
sub al, '0'
sub bl, '0'
; Add
add al, bl
; Conversion from decimal to ascii
add al, '0'
; We move the result
mov [result], al
; Print on screen the message 9
mov eax, 4
mov ebx, 1
mov ecx, msg9
mov edx, lmsg9
int 80h
; Print on screen the result
mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, 2
int 80h
; We end the program
jmp exit
subtract:
; We keep the numbers in the registers al and bl
mov al, [num1]
mov bl, [num2]
; Convert from ascii to decimal
sub al, '0'
sub bl, '0'
; Subtract
sub al, bl
; Conversion from decimal to ascii
add al, '0'
; We move the result
mov [result], al
; Print on screen the message 9
mov eax, 4
mov ebx, 1
mov ecx, msg9
mov edx, lmsg9
int 80h
; Print on screen the result
mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, 1
int 80h
; We end the program
jmp exit
multiply:
; We store the numbers in registers al and bl
mov al, [num1]
mov bl, [num2]
; Convert from ascii to decimal
sub al, '0'
sub bl, '0'
; Multiply. AX = AL x BL
mul bl
; Conversion from decimal to ascii
add ax, '0'
; We move the result
mov [result], ax
; Print on screen the message 9
mov eax, 4
mov ebx, 1
mov ecx, msg9
mov edx, lmsg9
int 80h
; Print on screen the result
mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, 1
int 80h
; We end the program
jmp exit
divide:
; We store the numbers in registers ax and bx
mov al, [num1]
mov bl, [num2]
mov dx, 0
mov ah, 0
; Convert from ascii to decimall
sub al, '0'
sub bl, '0'
; Division. AL = AX / BX
div bl
; Conversion from decimal to ascii
add ax, '0'
; We move the result
mov [result], ax
; Print on screen the message 9
mov eax, 4
mov ebx, 1
mov ecx, msg9
mov edx, lmsg9
int 80h
; Print on screen the result
mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, 1
int 80h
; We end the program
jmp exit
exit:
; Print on screen two new lines
mov eax, 4
mov ebx, 1
mov ecx, nlinea
mov edx, lnlinea
int 80h
; End the program
mov eax, 1
mov ebx, 0
int 80h
Dont forget to rate.
Cheers!!!
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.