2016-04-11 3 views
3

Я пытаюсь сделать ряд игр с угадыванием в коде сборки, который начинается с диапазона от 1 до 1, а затем увеличивается на 1 каждый раз, когда вы правильно отвечаете.Сборочный номер Guessing Game

По какой-то причине, хотя при запуске программы число, которое выводится для диапазона, невероятно высокое, а не 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 

После показа "Вы теряете!" вы попадаете в процедуру seedrand. Лучше использовать jmp skip.