tutorialspoint tutorial español assembler assembly x86 nasm

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.