我有这样的代码,我需要插入文本,并向后打印它,但当我向后打印文本时,它覆盖了我以前打印的字符串。添加一个图像以更好地理解:
I can solve it, by adding a line before the printBackWards method. but I'd like to know why this happens
谢谢你的时间。
;;deber#1-assembler RODRIGO MAIDANA
.model small
.stack 100h
.data
;arreglo para colectar caracteres
array db 256 dup('$'),'$'
;;Cadena de texto para solicitar valores y retornar valores
msg db 10,13,7, "Ingrese un texto: $"
resultado db 10,13,7, "El texto al reves es: $"
msgERROR db 10,13,7, "VALOR INGRESADO NO ES CORRECTO$"
.code
start:
mov ax, @data
mov ds, ax
mov dx, offset msg
call puts
call readText
mov cx, si
dec si
call putLine
mov dx, offset resultado
call puts
;;call putLine
call printArrayBackwards
call finish
;;Usamos contador para recorrer el array
printArrayBackwards:
mov dl, array[si]
dec si
call putc
loop printArrayBackwards
ret
;;Lee el texto que ingresa el usuario hasta ingresar Enter(13) o Esc(27).
readText:
call getc ;;Pedimos caracteres
mov array[si],al ;;Agregamos caracter al array
inc si
cmp al,13 ;;Verificamos si el caracter ingreado es ENTER
jne verifyEsc ;;Si no es Enter(13) vamos a verifyEsc
ret
verifyEsc:
cmp al,27 ;;Verificamos si el caracter ingreado es ESCAPE
jne readText ;;Si no es Esc(27) ejecutamos de vuelta la sub-rutina
dec si
mov array[si],0h ;;Borramos tecla esc
inc si
ret
;;Agrega un salto de linea
putLine:
push ax
push bx
push cx
push dx
mov dl, 13d
call putc
mov dl, 10d
call putc
pop dx
pop cx
pop bx
pop ax
ret
;;Ingresa chart por teclado
getc:
push bx
push cx
push dx
mov ah, 1h
int 21h
pop dx
pop cx
pop bx
ret
;;Imprimimos un caracter
putc:
push ax
push bx
push cx
push dx
mov ah, 2h
int 21h
pop dx
pop cx
pop bx
pop ax
ret
;;Imprimimos un string
puts:
push ax
push bx
push cx
push dx
mov ah, 9h
int 21h
pop dx
pop cx
pop bx
pop ax
ret
;;Reproduce DING
putBeep:
mov dl, 07h
call putC
ret
;;Liberamos recursos del procesador
finish:
mov ax, 4c00h
int 21h
ret
end start
1条答案
按热度按时间fslejnso1#
@Jester的预感是正确的!只要用户输入以回车结束,您的 readText 例程就会返回包含在SI寄存器的计数中的回车字节。因为后面的指令会使用该值设置一个计数器,并将偏移量移动到该特定的回车字节,它将是 printArrayBackwards 代码首先输出的carrriage返回。这将把光标移动到您写入消息“El texto al reves es:“。接下来输出的字符将开始覆盖消息。
最简单的解决方案可能是在 readText 返回的计数中不包括终止符: