如何通过NASM获得用户输入?

时间:2009-02-07 05:11:38

标签: assembly x86 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

我正在使用NASM进行组装。

2 个答案:

答案 0 :(得分:4)

看起来您没有使用适当的缓冲区来存储用户输入。

这个网站有一个很大的x86 tutorial分为23个部分,每天都有一个部分可以用来执行该部分。

day 14上,他展示了一个从用户读取字符串并将其存储到缓冲区中然后再将其打印出来的示例。

答案 1 :(得分:4)

您只是在不存储字符的情况下阅读字符。您应该将AL直接存储到StudentID / InBoxID / Assignment / Version中,而不是存储到'input'中。您可以利用它们在内存中的相对位置,并编写一个循环来填充所有这些,就像在一个连续的空间中一样。

可能会这样:

; 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。它可能更优化和/或更容易。