Assembly 集合号猜谜游戏
我试着用汇编代码做一个数字猜谜游戏,开始的范围是1到1,然后每次你得到正确的答案时递增1 出于某种原因,当我运行程序时,范围输出的数字非常高,而不是1,当我输入第一轮的答案1时,它说我输了,而不是继续。如果有人能帮我解决这些问题,那就太好了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"
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