1

NASM アセンブリを学習して、1 桁の数字入力を 2 つ読み取るプログラムを作成しようとしています。

で宣言された 2 つの変数があります.bss

num1 resb 1
num2 resb 1

次に、ユーザーに次のように数字を書くように依頼します。

; Get number 1
mov EAX,3
mov EBX,1
mov ECX,num1
mov EDX,1
int 0x80

; Get number 2
mov EAX,3
mov EBX,1
mov ECX,num2
mov EDX,1
int 0x80

1 桁の数値入力だけに関心があるので、 に設定EDX1ます。このようにして、ユーザーが何を入力しても、最初の文字だけが変数に格納されます (そうですか?)。

問題は、その最初の文字の後に続くすべての文字が将来の読み取りに使用されることです。入力5してから を押すENTERと、5に保存されnum1ますが、 を押して生成した改行ENTERは次の読み取り命令に続き、 に保存されnum2ます。明らかに、それは私が意図していたものではありません (ユーザーに数字を入力して Enter キーを押し、別の数字を入力してから Enter キーを押してもらいたいのです)。

可能な限り簡単な方法でこれを回避する方法が完全にはわかりません。

最も愚かなアイデアは、「ダミー」の読み取り命令をnum1との間に配置num2することでした。これは明らかに良くありません。

4

3 に答える 3

1

stdin をいじって無効にするI_CANONことはできますが、「難しい方法」になる可能性があります。厄介なユーザーが行儀が良い場合、2 バイトのバッファを使用して実行mov edx, 2することは機能します。つまり、2 番目のバイトをクリアするか、単に無視します。

厄介なユーザーは、行儀が悪い場合があります。「ガベージ入力」やその他のエラー状態を処理するには、通常、単に「作業を行う」よりもはるかに多くのコードが必要です! それに対処するか、「通常」動作するプログラムに満足するかのどちらかです。初心者には 2 番目のオプションで十分かもしれません。

厄介なユーザーは、数字を入力せずに「Enter」を押すだけかもしれません。この場合、プロンプトを再表示するか、「申し訳ありませんが、私のプログラムが気に入らなかった」と出力して終了します。または、「Enter」を押す前に複数の文字を入力する場合もあります。これは潜在的に危険です!悪意のあるユーザーが「1rm -rf .」と入力すると、システム全体が一掃されます! Unix は強力であり、他の強力なツールと同様に、熟練していないユーザーの手に渡ると危険な場合があります。

次のようなことを試すことができます (警告: テストされていないコードが先にあります!)...

section .bss
    num1 resb 1
    num2 resb 1
    trashbin resb 1

section .text
re_prompt:
; prompt for your number
; ...
; get the number (character representing the number!)
    mov ecx, num1
reread:
    mov edx, 1
    mov ebx, 0 ; 1 will work, but 0 is stdin
    mov eax, 3 ; sys_read
    int 0x80
    cmp byte [ecx], 10 ; linefeed
    jz got_it
    mov ecx, trashbin
    jmp reread
got_it:
    cmp byte [num1], 10 ; user entered nothing?
    jz re_prompt ; or do something intelligent
; okay, we have  a character in num1
; may want to make sure it's a valid digit
; convert character to number now?
; carry on

それを機能させるには、それをいじる必要があるかもしれません。おそらく、テストされていないコードを投稿するべきではありません (そうすると恥ずかしい思いをする可能性があります!)。「そのようなこと」は、いじるよりも簡単かもしれませんtermios。Michael から提供された 2 番目のリンクには、私がそのために使用するコードが含まれています。私はあまり満足していません (ずさんな!) が、「ちょっとうまくいく」。いずれにせよ、楽しんでください!:)

于 2013-09-13T12:52:46.583 に答える