2009-02-07 27 views
2

Le programme doit prendre une chaîne simple de l'utilisateur et l'afficher. J'ai obtenu le programme pour prendre l'entrée de l'utilisateur mais je n'arrive pas à le stocker. Voici ce que j'ai jusqu'à présent:Comment obtenir une entrée de l'utilisateur avec NASM?

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 

Je l'assemble en utilisant NASM.

Répondre

4

Vous lisez uniquement les caractères sans les stocker. Au lieu de stocker dans cette 'entrée', vous devez stocker AL soit directement dans StudentID/InBoxID/Assignment/Version. Vous pourriez profiter de leurs positions relatives en mémoire et écrire une seule boucle pour les remplir, comme dans un espace contigu.

Il pourrait se présenter comme suit:

; 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 

Je n'ai pas testé, donc il peut avoir des erreurs qu'il contient.

Ou vous pouvez utiliser d'autres fonctions DOS, en particulier INT21h/0Ah. Cela pourrait être plus optimal et/ou plus facile.

+0

Je suppose que cela ferait partie de ma question. Comment pourrais-je stocker le contenu de al dans une chaîne de quelque sorte. – Xill

+0

Ok, ajouté un exemple de code. –

4

Il semble que vous n'utilisiez pas un tampon approprié pour stocker l'entrée des utilisateurs.

Ce site a un grand x86 tutorial divisé en 23 sections, une pour chaque jour que vous êtes supposé faire cette section.

Ici, sur day 14, il montre un exemple de lecture dans une chaîne de l'utilisateur et de le stocker dans un tampon, puis de l'imprimer à nouveau.

+0

Je voudrais répondre à la question purement et simplement, mais je ne connais que l'assemblage MIP et l'assemblage x86 a quelques différences distinctes. Si vous suivez ce tutoriel de jours, vous devriez être en mesure d'obtenir le résultat souhaité. – mmcdole