Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 延迟在组件8086中不起作用_Assembly_Delay_X86 16 - Fatal编程技术网

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=1
jnz
读作“如果非零则跳转”,但基于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]