Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

Modify the following code to make a program in assembly version 8086 that adds, subtracts, multiplies and divides two whole numbers (the user will predict

Modify the following code to make a program in assembly version 8086 that adds, subtracts, multiplies and divides two whole numbers (the user will predict the numbers) The user should decide when the program close.

CODE:

.MODEL SMALL

.STACK

.DATA

NEWLINE db 0Dh, 0Ah, '$' PROMPT db "Entre una cadena de caracteres: ",'$' CHARACTER db ?

STRING db 81 dup('$') MAX_LEN equ 80

CARRIAGE_RETURN equ 0Dh LINE_FEED equ 0Ah

IS_VALID db ? UNSIGNED_INT dw ?

TRUE equ 1h FALSE equ 0h

.CODE

MAIN PROC

mov ax, @DATA mov ds, ax

call NEW_LINE

call SHOW_PROMPT call ASK_STRING

call NEW_LINE call NEW_LINE

call SHOW_STRING

call NEW_LINE call NEW_LINE

call IS_UNSIGNED_INT cmp byte ptr IS_VALID, FALSE jz GO_NEXT

call STRING_TO_UNSIGNED_INT add word ptr UNSIGNED_INT, 10 call UNSIGNED_INT_TO_STRING

GO_NEXT: call SHOW_STRING

call NEW_LINE call NEW_LINE

mov ax, 4c00h ; exit program int 21h ; return AL RET

MAIN ENDP

;***********************************************************************************

UNSIGNED_INT_TO_STRING PROC

mov ax, UNSIGNED_INT mov bx, 10 mov di, 0h

ANOTHER: mov dx, 0h div bx add dl, '0' mov STRING[di], dl inc di cmp ax, 0h jnz ANOTHER

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]

BACK: cmp cl, '$' jz CONVERTED mul bx sub cl, '0' add ax, cx inc di mov cl, STRING[di]

jmp BACK CONVERTED: 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] 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

Step: 1

blur-text-image

Get Instant Access to Expert-Tailored Solutions

See step-by-step solutions with expert insights and AI powered tools for academic success

Step: 2

blur-text-image

Step: 3

blur-text-image

Ace Your Homework with AI

Get the answers you need in no time with our AI-driven, step-by-step assistance

Get Started

Recommended Textbook for

Database Design And Relational Theory Normal Forms And All That Jazz

Authors: Chris Date

1st Edition

1449328016, 978-1449328016

More Books

Students also viewed these Databases questions

Question

I was partially responsible.

Answered: 1 week ago