2016-04-11 24 views
3

私は、1対1の範囲で始まり、次に正しい答えを得るたびに1ずつインクリメントするアセンブリコードで、数を推測してゲームを作ろうとしています。アセンブリ番号推測ゲーム

私はプログラムを実行するときに範囲のために出力される数値が1ではなく非常に高いですが、最初のラウンドの答えである1を入力すると、続行する代わりに失われます。だから誰でも偉大な問題を私に助けることができたら!

include \masm32\include\masm32rt.inc 

.data 

formatString BYTE "guess a number from 1 to %d , if you get it right you continue", 0ah, 0dh, 0 
guessstr BYTE 11 DUP (0) 
guess DWORD ? 
range DWORD 0 
answer DWORD 1 
prompt BYTE "You lose!", 0 

.code 
main proc 
    call seedrand 

nextlevel: 
    move eax, 0 
    mov range, ebx 
    add ebx, 1 
    pushd ecx 
    call randnum 
    invoke crt_printf, ADDR formatString, ebx 
    invoke StdIn, ADDR guessstr, 10 
    invoke atodw, ADDR guessstr 
    mov guess, edx 
    add ecx, 1 

    cmp eax, ebx 
    je nextlevel 

    invoke StdOut, ADDR prompt 
    jnz skip 

seedrand proc 
    ; seeds the random number generator 
    ; _stdcall 
    invoke GetTickCount ; result goes in eax 
    invoke nseed, eax 

    ret 
seedrand endp 

randomnum proc 
    ; generate a random number 
    ; _stdcall 
    mov eax, [esp+4] 
    invoke nrandom, eax 

    ret 4 
randomnum endp 


skip: 

    ; return 0 
    mov eax, 0 
    ret 

main endp 
end main 
+0

これらはすべて良い計画のようです。残念ながら、あなたは実際に質問をしていません。 –

+0

私はそれを編集しました、私は問題を言及したと思いますが、実際に彼らに助けを求めませんでした – student

+2

それでは、デバッガでシングルステップするとどうなるでしょうか?あなたが取ることができないと予想された支店や、あなたが期待していない値を持つ登記所はいつの時点にありますか? asmにデバッガを使用することを学ぶことは絶対に不可欠です。 –

答えて

2
move eax, 0 

これは有効な命令ではありません。あなたが上限を初期化することを意図したのでしょうか?それはあなたが忘れたものですから! xor ebx, ebx

cmp eax, ebx 
je nextlevel 

ことによってそれを交換してあなただけのEDXレジスタから推測変数にユーザーの推測を移動しました。ここでは、これらのいずれかと比較する必要があります。確かに上限値ではありません。

invoke StdOut, ADDR prompt 
jnz skip 
; 
seedrand proc 

表示した後、 "あなたは失います!"あなたはシードランド手順に該当します。より良い使用jmp skip

関連する問題