Tome varias entradas e imprímalas
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.
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 loop
instrucció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.