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
Step: 1
Get Instant Access to Expert-Tailored Solutions
See step-by-step solutions with expert insights and AI powered tools for academic success
Step: 2
Step: 3
Ace Your Homework with AI
Get the answers you need in no time with our AI-driven, step-by-step assistance
Get Started