Tome varias entradas e imprímalas

Resuelto John Paulo Pascua asked hace 7 meses • 0 respuestas

Este es mi programa:

data segment

str1 db "What is your name: $"   
str2 db "How old are you? $"
str3 db 13,10, "Name Output is: $"
str4 db 13,10, "Age Output is: $"

Arr db 10 dup('$')
Arr2 db 10 dup('$') 
ends

stack segment
     dw 128 dup(0)    
ends

code segment
start:

mov ax, @data
mov ds, ax   

lea dx, str1
mov ah, 09h
int 21h

mov ah, 10  ; string input sub-rountine
lea dx, Arr ; get offset address of array
mov arr,10
int 21h
 
mov dx,13
mov ah,2
int 21h  
mov dx,10
mov ah,2
int 21h
 
lea dx, str2
mov ah, 09h
int 21h 

mov ah, 10
lea dx, Arr2
mov arr, 11
int 21h


lea dx, str3
mov ah, 09h
int 21h 

mov ch, 0 
mov cl, Arr[1] ;cl = counter of character
mov si, 2
mov ah, 02h
output:
mov dl,Arr[si]
int 21h
inc si
mov dl,' '
loop output 

mov ax, 4c00h
int 21h

Tiene éxito al imprimir el nombre, pero la edad no se puede imprimir porque la entrada es un poco difícil.

Quiero ingresar el nombre, la edad, el país y hacer que su salida se pueda imprimir en cada código.

John Paulo Pascua avatar Feb 17 '24 07:02 John Paulo Pascua
Aceptado

Lea Cómo funciona la entrada almacenada en búfer para aprender cómo configurar correctamente la función DOS.BufferedInput 0Ah.
Lo siguiente podría aplicarse a su caso (su propio nombre (completo) tiene más de 10 caracteres):

Arr1 db 30, 0, 30 dup(0)    ; This has room for 29 characters
Arr2 db 3, 0, 3 dup(0)      ; This has room for 2 decimal digits (ages up to 99)

Dices que la entrada para la edad es "un poco difícil". Bueno, veo que tienes una confusión entre los buffers Arr y Arr2 . Ese número 11 debería ir al búfer Arr2 . Además, el valor 11 es incorrecto para un buffer que sólo comprende 10 bytes.

mov ah, 10
lea dx, Arr2
mov arr, 11      <<<<< Should go to Arr2
int 21h

No hagas trabajos redundantes. El retorno de carro más el salto de línea, que ahora realiza después de la entrada, no necesita el retorno de carro en absoluto. El cursor ya habrá sido colocado al principio de la línea. Sólo es necesario el salto de línea y debes usar DL para ello (no DX):

mov  dl, 10
mov  ah, 02h
int  21h

Y ni siquiera necesitaría agregar estas líneas, si tan solo almacenara los códigos de control coincidentes en sus definiciones de cadena:

str1 db "What is your name? $"
str2 db 10, "How old are you? $"
str3 db 10, 10, "Name Output is: $"
str4 db 13, 10, "Age Output is: $"

mov dl,' '            <<<<< ???
loop output 

El bucle de salida mueve de forma redundante un carácter de espacio a DL justo antes de la loopinstrucción. Simplemente elimine esa línea.

Resumen

El siguiente código utiliza los buffers Arr1 y Arr2 sugeridos anteriormente y la modificación de las cadenas de texto. Si cada uno de estos buffers se usa solo una vez, entonces se pueden omitir las líneas que he marcado con un asterisco (*).

mov  dx, OFFSET str1       ; `lea dx, str1` has a 1 byte longer encoding, so prefer
mov  ah, 09h               ; to write `mov dx, offset str1` (less is generally better)
int  21h
mov  dx, OFFSET Arr1
mov  word ptr [Arr1], 30     (*)
mov  ah, 0Ah
int  21h
 
mov  dx, OFFSET str2
mov  ah, 09h
int  21h
mov  dx, OFFSET Arr2
mov  word ptr [Arr2], 3      (*)
mov  ah, 0Ah
int  21h

mov  dx, OFFSET str3
mov  ah, 09h
int  21h 
mov  si, 2
mov  ah, 02h
output1:
mov  dl, Arr1[si]
int  21h
inc  si
cmp  dl, 13
jne  output1

mov  dx, OFFSET str4
mov  ah, 09h
int  21h 
mov  si, OFFSET Arr2 + 2
mov  ah, 02h
output2:
mov  dl, [si]
int  21h
inc  si
cmp  dl, 13
jne  output2

Antes de copiar/pegar esto a ciegas, observe las diferentes formas de abordar las matrices. ¿Y notaste que no usé la longitud de la cadena tal como nos la devolvió DOS? En lugar de eso, basé mis bucles en el retorno de carro obligatorio que DOS agrega a nuestros caracteres en el búfer de entrada.

Sep Roland avatar Feb 17 '2024 20:02 Sep Roland