Как я могу получить пользовательский ввод с NASM? - PullRequest
2 голосов
/ 07 февраля 2009

Программа должна взять у пользователя простую строку и отобразить ее обратно. Я получил программу, чтобы принять ввод от пользователя, но я не могу сохранить его. Вот что у меня есть:

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

Я собираю это с помощью NASM.

Ответы [ 2 ]

4 голосов
/ 07 февраля 2009

Вы только читаете символы, не сохраняя их. Вместо того, чтобы сохранять в этот «вход», вы должны сохранять AL либо непосредственно в StudentID / InBoxID / Assignment / Version. Вы можете воспользоваться их относительными позициями в памяти и написать один цикл, чтобы заполнить их все, как в непрерывном пространстве.

Это может пойти так:

; 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

Я не тестировал, поэтому в нем могут быть ошибки.

Или вы можете использовать другие функции DOS, в частности INT21h / 0Ah . Это может быть более оптимальным и / или более простым.

4 голосов
/ 07 февраля 2009

Похоже, вы не используете надлежащий буфер для хранения ввода пользователя.

На этом сайте есть большое x86 учебное пособие , разделенное на 23 раздела, по одному на каждый день, в который вы должны делать этот раздел.

Здесь, в день 14 , он показывает пример чтения строки пользователем и сохранения ее в буфере, а затем распечатки обратно.

...