Assembly 延迟在组件8086中不起作用
我正在尝试开发俄罗斯方块,我有一些延迟的问题 我将此用作延迟:Assembly 延迟在组件8086中不起作用,assembly,delay,x86-16,Assembly,Delay,X86 16,我正在尝试开发俄罗斯方块,我有一些延迟的问题 我将此用作延迟: mov ah, 86h mov cx, 0Fh mov dx, 4240h int 15h 但正如你在GIF中看到的,当我试图移动积木时,它会变得疯狂 我真的需要你尽快帮我解决这个问题 要下载完整的代码文件,请按 程序的不稳定行为源于这样一个事实,即您没有正确解释在int 16h处使用BIOS功能01h检查键盘的结果。设置ZF时,意味着没有可用的键,因此您应该跳回G_Init。如果ZF已清除,只需在
mov ah, 86h
mov cx, 0Fh
mov dx, 4240h
int 15h
但正如你在GIF中看到的,当我试图移动积木时,它会变得疯狂
我真的需要你尽快帮我解决这个问题
要下载完整的代码文件,请按
程序的不稳定行为源于这样一个事实,即您没有正确解释在int 16h
处使用BIOS功能01h检查键盘的结果。设置ZF时,意味着没有可用的键,因此您应该跳回G_Init。如果ZF已清除,只需在chk_键部分插入,但请记住从键盘缓冲区中实际移除键
G_Init:
call Gravity
mov ah, 01h ;Test for key
int 16h
jz G_Init ;No key available!
mov ah, 00h ;Remove key
int 16h
chk_Key:
许多人在使用
jz
/jnz
时遇到麻烦,因为这是违反直觉的:
jz
读作“如果为零,则跳转”,但根据ZF=1jnz
读作“如果非零则跳转”,但基于ZF=0
我发现的第二个问题是,在标签R_Left和R_Right上,您使用的是
lea bx,[location]
,实际上您应该使用mov bx,[location]
。您不需要位置变量本身的地址,但需要存储在位置变量中的地址
R_Left:
call clblk
mov bx, [location] ;Makes BX point within 'pic.inc'
sub [spx], 5
call Draw2d
jmp delay
R_Right:
call clblk
mov bx, [location]
返回后验证
CF
是否清除。验证是否确实是延迟导致了问题,例如通过使用延迟回路。已知DOSBox对此延迟功能有困难。看一看,我尝试了循环延迟,但它也不起作用。问题可能出现在绘图过程中?
R_Left:
call clblk
mov bx, [location] ;Makes BX point within 'pic.inc'
sub [spx], 5
call Draw2d
jmp delay
R_Right:
call clblk
mov bx, [location]