Question: Fix the following assembly x86 code to perform the adding of two numbers: .MODEL SMALL .STACK .DATA NUM1 DB ? NUM2 DB ? RESULT DB
Fix the following assembly x86 code to perform the adding of two numbers:
.MODEL SMALL
.STACK
.DATA
NUM1 DB ? NUM2 DB ? RESULT DB ? NEWLINE db 0Dh, 0Ah, '$' PROMPT1 DB 10,13,"ENTER FIRST NUMBER TO ADD :", '$'
PROMPT2 DB 10,13,"ENTER SECOND NUMBER TO ADD :", '$'
PROMPT3 DB 10,13,"RESULT OF ADDITION IS :", '$'
CHARACTER db ?
STRING db 81 dup('$')
MAX_LEN equ 80
CARRIAGE_RETURN equ 0Dh
LINE_FEED equ 0Ah
IS_VALID db ?
UNSIGNED_INT dw ?
SIGNO db ?
TRUE equ 1h
FALSE equ 0h
.CODE
MAIN PROC mov ax, @DATA
mov ds, ax ;MOV AX, MSG1 ;MOV BX, MSG2
call NEW_LINE
call SHOW_PROMPT
call ASK_STRING
call NEW_LINE
call NEW_LINE
call SHOW_STRING
call IS_UNSIGNED_INT
cmp byte ptr IS_VALID, FALSE
jz GO_NEXT
call STRING_TO_UNSIGNED_INT
call ADD_ROUTINE
call UNSIGNED_INT_TO_STRING
GO_NEXT:
call NEW_LINE
call NEW_LINE
call NEW_LINE
call NEW_LINE
call SHOW_STRING
call NEW_LINE
call NEW_LINE
mov ax, 4c00h ; exit program
int 21h ; return AL
RET MAIN ENDP
ADD_ROUTINE PROC PUSH AX MOV AX, 0FFFH MOV BX, 1H
ADD AX, BX
MOV CX, AX
MOV DX, OFFSET PROMPT MOV AH, 09H INT 21H
POP AX RET
ADD_ROUTINE ENDP
;***********************************************************************************
UNSIGNED_INT_TO_STRING PROC
mov ax, UNSIGNED_INT
mov bx, 10
mov di, 0h
cmp byte ptr SIGNO,-1
jnz ANOTHER
imul SIGNO
ANOTHER:
mov dx, 0h
div bx
add dl, '0'
mov STRING[di], dl
inc di
cmp ax, 0h
jnz ANOTHER
cmp SIGNO, -1
jnz NO_NEGATIVE
mov byte ptr STRING[di], '-'
inc di
NO_NEGATIVE:
mov STRING[di], '$'
dec di
mov si, 0
OTHER:
mov ch, STRING[di]
mov cl, STRING[si]
mov STRING[di], cl
mov STRING[si], ch
dec di
inc si
cmp si, di
jb OTHER
RET
UNSIGNED_INT_TO_STRING ENDP
;***********************************************************************************
STRING_TO_UNSIGNED_INT PROC
mov ax, 0h
mov cx, 0h
mov bx, 10
mov di, 0h
mov cl, STRING[di]
cmp cl, '-'
jz GOTO
cmp cl, '+'
jnz BACK
GOTO:inc di
mov cl, STRING[di]
BACK:
cmp cl, '$'
jz CONVERTED
mul bx
sub cl, '0'
add ax, cx
inc di
mov cl, STRING[di]
jmp BACK
CONVERTED:
imul SIGNO
mov UNSIGNED_INT, ax
RET
STRING_TO_UNSIGNED_INT ENDP
;***********************************************************************************
IS_UNSIGNED_INT PROC
mov byte ptr IS_VALID, TRUE
mov di, 0h
mov ah, STRING[di]
mov byte ptr SIGNO,+1
cmp ah, '-'
jnz ISPOSITIVE
mov byte ptr SIGNO,-1
jmp PROXIMO_CHAR
ISPOSITIVE:cmp ah, '+'
jnz NEXT_CHAR
PROXIMO_CHAR:inc di
mov ah, STRING[di]
NEXT_CHAR:
cmp ah, '$'
jz DECIDIR
cmp ah, '0'
jb DECIDIR
cmp ah, '9'
ja DECIDIR
inc di
mov ah, STRING[di]
jmp NEXT_CHAR
DECIDIR:
jnz NOT_VALID
cmp di, 0h
jnz KEEP
NOT_VALID:
mov byte ptr IS_VALID, FALSE
KEEP:
RET
IS_UNSIGNED_INT ENDP
;***********************************************************************************
SHOW_PROMPT PROC
mov dx, offset PROMPT ; write all characters
mov ah, 09h ; in the standard output
int 21h ; DX has the offset of the first character
RET ; the last character must be '$'
SHOW_PROMPT ENDP
;***********************************************************************************
SHOW_CHARACTER PROC
mov ah, 02h ; write a character to standard ouput mov dl, CHARACTER ; DL has the character int 21H RET
SHOW_CHARACTER ENDP
;***********************************************************************************
ASK_CHARACTER PROC
mov ah, 08h ; read a character without echo from standard input int 21h ; AL stores the character read mov CHARACTER, al RET
ASK_CHARACTER ENDP
;************************************************************************
NEW_LINE PROC
mov dx, offset NEWLINE ; write all characters mov ah, 9 ; in the standard output int 21h ; DX has the offset of the first character RET ; the last character must be '$'
NEW_LINE ENDP
;***********************************************************************************
ASK_STRING PROC
mov di, 0h
GET_NEXT: call ASK_CHARACTER call SHOW_CHARACTER mov bl, CHARACTER cmp bl, CARRIAGE_RETURN jz EOL cmp di, MAX_LEN je SKIP mov STRING[di], bl inc di SKIP: jmp GET_NEXT EOL: mov STRING[di], '$' call CLEAR_KEYBOARD_BUFFER RET ASK_STRING ENDP
;***********************************************************************************
SHOW_STRING PROC
mov dx, offset STRING ; write all characters mov ah, 09h ; in the standard output int 21h ; DX has the offset of the first character RET ; the last character must be '$'
SHOW_STRING ENDP
;***********************************************************************************
CLEAR_KEYBOARD_BUFFER PROC
mov ah, 0bh ; check standard input status int 21h ; AL = 0 if input buffer is empty cmp al, 0h ; jz CLEARED ; are there no more characters in the standard input
NEXT:
call ASK_CHARACTER mov ah, 0bh ; check standard input status int 21h ; AL = 0 if input buffer is empty cmp al, 0h ; jnz NEXT ; are there more characters in the standard input
CLEARED: RET CLEAR_KEYBOARD_BUFFER ENDP
end MAIN
Step by Step Solution
There are 3 Steps involved in it
Get step-by-step solutions from verified subject matter experts
