Question: Write an assembly code that automatically adds 10 to the input. If the input is 123 the result will be 133. If the input is

Write an assembly code that automatically adds 10 to the input. If the input is 123 the result will be 133. If the input is -123 the result will be -113 Because -123 + 10 = -113. If the input has a string the input will stay the same. For example the input is -1A the result will be -1A. If the input is ABC the result will be ABC.

Modify this following program to do what was mentioned above:

.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 ? SIGNO db ?

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 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]

mov byte ptr SIGNO,1h cmp cl, '-' jnz NEXT_CHAR mov byte ptr SIGNO,-1 cmp cl, '+' jnz NEXT_CHAR 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: mul SIGNO

mov UNSIGNED_INT, ax

RET

STRING_TO_UNSIGNED_INT ENDP

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

mov byte ptr SIGNO,1h cmp ah, '-' jnz NEXT_CHAR mov byte ptr SIGNO,-1 cmp ah, '+' jnz NEXT_CHAR inc di mov ah, STRING[di]

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

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

2:52 PM 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!