Assembly 集合号猜谜游戏

Assembly 集合号猜谜游戏,assembly,random,x86,masm32,Assembly,Random,X86,Masm32,我试着用汇编代码做一个数字猜谜游戏,开始的范围是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"

我试着用汇编代码做一个数字猜谜游戏,开始的范围是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
这不是有效的指令。你是不是想初始化上限?因为那是你忘了的东西!将其替换为异或ebx,ebx

您刚刚将用户的猜测从
EDX
寄存器移动到了guess变量。在这里,您应该与其中一个进行比较,当然不是与上限进行比较


在显示“You lose!”后,您在seedrand过程中失败。最好使用
jmp skip

这些听起来都是不错的计划。不幸的是,您没有真正提出问题。我编辑了它,我想我提到了这些问题,但实际上没有寻求帮助。那么,当您在调试器中单步执行时,您会看到什么?在哪一点上会有一个您期望不会被执行的执行分支,或者一个寄存器的值与您期望的值不符?学习为asm使用调试器是绝对必要的。
move eax, 0
cmp eax, ebx
je nextlevel
invoke StdOut, ADDR prompt
jnz skip
;
seedrand proc