assembly 程序集8086覆盖文本

j9per5c4  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(131)

我有这样的代码,我需要插入文本,并向后打印它,但当我向后打印文本时,它覆盖了我以前打印的字符串。添加一个图像以更好地理解:
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
fslejnso

fslejnso1#

call readText

mov cx, si
dec si

@Jester的预感是正确的!只要用户输入以回车结束,您的 readText 例程就会返回包含在SI寄存器的计数中的回车字节。因为后面的指令会使用该值设置一个计数器,并将偏移量移动到该特定的回车字节,它将是 printArrayBackwards 代码首先输出的carrriage返回。这将把光标移动到您写入消息“El texto al reves es:“。接下来输出的字符将开始覆盖消息。
最简单的解决方案可能是在 readText 返回的计数中不包括终止符:

readText:
    xor  si, si             ; Make sure you start at the beginning of the array
PedimosCaracteres:
    call getc               ; -> AL
    cmp  al, 27
    je   esEsc
    cmp  al, 13
    je   esEnter
    mov  array[si], al
    inc  si                 ; Only counting 'true' characters
    jmp  PedimosCaracteres
esEsc: 
    mov  al, 0
esEnter:
    mov  array[si], al      ; Doesn't include the terminator {0,13} in the count
    ret

相关问题