2

プログラムは、ユーザーから単純な文字列を受け取り、それを表示する必要があります。ユーザーからの入力を取得するプログラムを取得しましたが、保存できないようです。これが私がこれまでに持っているものです:

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 を使用してこれを組み立てています。

4

2 に答える 2

4

ユーザー入力を保存するために適切なバッファを使用していないようです。

このサイトには、23 のセクションに分割された大規模なx86 チュートリアルがあり、そのセクションを行うと思われる日ごとに 1 つずつあります。

ここで14 日目に、彼はユーザーから文字列を読み取り、それをバッファーに格納してから、再度出力する例を示しています。

于 2009-02-07T05:45:24.327 に答える
4

文字を保存せずに読み取るだけです。その「入力」に格納する代わりに、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を使用することもできます。より最適かつ/または簡単になる可能性があります。

于 2009-02-07T05:56:16.113 に答える