2012-03-03 7 views
1

配列に数値を入力するプログラムを作成しようとしていて、数値の1つを検索することができるようにしようとしています。私は彼らの入力を "n"と "N"と比較しなければならない場所を再び検索することができます。私はそれが正しく動作するように見えることはできません。私はatowを使用するのが正しい入力かどうかはわかりませんが、ここにコードがあります。アセンブリ言語を再度検索

number1   WORD  ? 
anArray   WORD  100 DUP (?) 
count   WORD  ? 
search   WORD  ? 
searchn   BYTE  "n",0 
searchNo   BYTE  "N",0 
prompt1   BYTE  "Enter a number or -1 to quit.", 0 
prompt2   BYTE  "Enter a number to search for", 0 
prompt3   BYTE  "Search for another number Y/N",0 
inString  BYTE  40 DUP (?) 
outMsgLabel  BYTE  "Search Result", 0 
frontOut1  BYTE  6 DUP (?) 
outMsg1   BYTE  " is element" 
rearOut1  BYTE  6 DUP (?),0 
frontOut2  BYTE  6 DUP (?) 
outMsg2   BYTE  " is not in array",0 

searchAgain: input  prompt3, inString, 40 
       atow  inString 
       mov   dx,ax 
       atow  searchn 
       mov   ax,"n" 
       cmp   ax,dx 
       je   end1 
       atow  searchNo 
       mov   ax,"N" 
       cmp   ax,dx 
       je   end1 
       jmp   next 

私は、動作しないコードと.DATAセクションのスニペットのみを含んでいます。

+0

書き込みをして、それを変換:まあいずれにせよ、あなたはありません、その内容

これを試してみてください言葉にinStringのアドレスを変換しようとしています。そして、デバッガを使ってそれをデバッグします。 –

+0

私はデバッガを使用していましたが、大学のコースでアセンブリ言語を学んでいます。私はC + +でそれを書いてみました、そしてそれを変換しましたが、私はそれを見つけることができません。それは、axレジスタに0を生成するため、inStringを単語に変換することと思われます。私の先生は、文字列を比較したり、文字列を変換する方法を教えていませんでした。 – todaroa

+1

これはどのアーキテクチャですか?それはmasmのi86のように少し見えますが、私は 'atow'や' input'を認識しません... –

答えて

0

誰もがなぜHLLでそれを最初に書きますか?

なぜWORDサイズを使用していますか?プロセッサ32ビットの自然なサイズを使用してください。

これはどのアセンブラですか?それがMASMか他のものであれば、マクロや関数を入力しますか?その最初の高級言語で

prompt3   BYTE "Search for another number Y/N ? >" 
PROMPT3_SIZE equ  $ - prompt3 



SearchAgain: 
    push PROMPT3_SIZE 
    push offset prompt3 
    call WriteToConsole 

    call GetKeyCode 
    cmp  eax, 78   ; N 
    je  end1 
    cmp  eax, 110  ; n 
    je  end1 
    cmp  eax, 65   ; Y 
    je  Continue   
    cmp  eax, 97   ; y 
    je  Continue 

    ; invalid char was entered, do whatever here 
    jmp  SearchAgain  

end1: 
    ; don't want to search again 
Continue: 
    ; search for character 

; ... 
; ... 
; ... 
    push 0 
    call ExitProcess 
WriteToConsole: 
    enter 0, 0 

    push STD_OUTPUT_HANDLE 
    call GetStdHandle 

    push 0 
    push 0 
    push [ebp + 12] 
    push [ebp + 8] 
    push eax 
    call WriteConsole 

    leave 
    ret  4 *2 

GetKeyCode: 
    push STD_INPUT_HANDLE 
    call GetStdHandle 

    push eax 
    call FlushConsoleInputBuffer 

    call crt__getch 
    xor  ecx, ecx  ; zero ecx for non extended key return value 
    test eax, eax 
    jz  @F 
    cmp  eax, 0E0h 
    jnz  quit 
@@: 
    call crt__getch 
    mov  ecx, 1   ; return 1 in ECX if an extended key is pressed 
quit: 
    ret