Wie kann ich eine Benutzereingabe mit NASM bekommen?
Frage
Das Programm muss in einem einfachen String vom Benutzer zu übernehmen und sie wieder anzuzeigen. Ich habe das Programm zu nehmen Eingaben vom Benutzer bekommen, aber ich kann nicht scheinen, um es zu speichern. Hier ist, was ich habe, so weit:
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
ich dies mit NASM bin Montage.
Lösung
Sie lesen nur die Zeichen, ohne sie zu speichern. Statt in diesem ‚Input‘ zu speichern, sollten Sie AL speichern entweder direkt in StudentID / InBoxID / Assignment / Version. Sie könnten die Vorteile ihrer relativen Positionen im Speicher nehmen und eine einzige Schleife schreiben alle von ihnen, wie es in einem zusammenhängenden Raum zu füllen.
Es könnte so gehen:
; 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
habe ich nicht getestet, so dass es Fehler in ihm haben könnten.
Oder könnten Sie andere DOS-Funktionen verwenden, speziell INT21h / 0Ah . Es könnte sein, mehr optimal und / oder zu erleichtern.
Andere Tipps
Es sieht aus wie Sie nicht einen richtigen Puffer werden mit dem Benutzer Eingabe zu speichern.
Diese Seite hat eine große x86 Tutorial in 23 Abschnitte aufgeteilt, eine für jeden Tag Sie vermuten, dass Abschnitt zu tun.
Hier auf Tag 14 er von dem Benutzer ein Beispiel für das Lesen in einer Reihe zeigt, und Speichern sie in einen Puffer, den Druck anschließend wieder heraus.