2016-04-11 96 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