assembly - tutorial - ¿Cómo obtengo la entrada del usuario con NASM?
nasm tutorial español (2)
El programa necesita tomar una cadena simple del usuario y mostrarla de nuevo. He obtenido el programa para recibir información del usuario, pero parece que no puedo almacenarlo. Esto es lo que tengo hasta ahora:
BITS 32
global _main
section .data
prompt db "Enter a string: ", 13, 10, ''$''
input resd 1 ; something I can using to store the users input.
name db "Name: ******", 13, 10,''$''
StudentID db "********", 13, 10, ''$''
InBoxID db "*************", 13, 10, ''$''
Assignment db "************", 13, 10, ''$''
version db "***************", 13, 10, ''$''
section .text
_main:
mov ah, 9
mov edx, prompt
int 21h
mov ah, 08h
while:
int 21h
; some code that should store the input.
mov [input], al
cmp al, 13
jz endwhile
jmp while
endwhile:
mov ah, 9
; displaying the input.
mov edx, name
int 21h
mov edx, StudentID
int 21h
mov edx, InBoxID
int 21h
mov edx, Assignment
int 21h
mov edx, version
int 21h
ret
Estoy armando esto usando NASM.
Parece que no está utilizando un búfer adecuado para almacenar la entrada de los usuarios.
Este sitio tiene un gran tutorial x86 dividido en 23 secciones, una para cada día en que se supone que debes hacer esa sección.
Aquí, el día 14 , muestra un ejemplo de cómo leer en una cadena del usuario y almacenarlo en un búfer, y luego imprimirlo de nuevo.
Solo lees los personajes sin guardarlos. En lugar de almacenar en esa ''entrada'', debe almacenar AL directamente en StudentID / InBoxID / Assignment / Version. Puede aprovechar sus posiciones relativas en la memoria y escribir un solo bucle para llenar todas ellas, como en un espacio contiguo.
Podría ser así:
; For each string already padded with 13, 10, $
; at the end, use the following:
mov ah, 08h
mov edi, string
mov ecx, max_chars
cld
while:
int 21h
stosb ; store the character and increment edi
cmp ecx, 1 ; have we exhausted the space?
jz out
dec ecx
cmp al, 13
jz terminate ; pad the end
jmp while
terminate:
mov al, 10
stosb
mov al, ''$''
stosb
out:
; you can ret here if you wish
No probé, por lo que podría tener errores.
O podría usar otras funciones de DOS, específicamente INT21h / 0Ah . Podría ser más óptimo y / o más fácil.