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

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!