Assembly 如何在部件中处理动画循环
我正在汇编中制作一个基于文本的动画,其中需要大量的屏幕刷新以使其尽可能平滑并模拟反弹物理。我使用Assembly 如何在部件中处理动画循环,assembly,Assembly,我正在汇编中制作一个基于文本的动画,其中需要大量的屏幕刷新以使其尽可能平滑并模拟反弹物理。我使用int 1ah调用来控制屏幕刷新延迟,并使形状看起来好像在达到峰值时变慢,在下降时变快。在每次呼叫清除后,屏幕上还会显示一个单独的横幅 我编写了处理移动形状代码的代码,它按预期工作。当我添加额外的代码,将一个固定的横幅放在屏幕上,它会在某一点后锁定dosbox 在一个较大的循环中包含以下代码的八个变体。在我添加之前,它运行良好;将横幅打印到第七个内循环。实际上,它在下面的循环中的第一个LEA上中断,在
int 1ah
调用来控制屏幕刷新延迟,并使形状看起来好像在达到峰值时变慢,在下降时变快。在每次呼叫清除后,屏幕上还会显示一个单独的横幅
我编写了处理移动形状代码的代码,它按预期工作。当我添加额外的代码,将一个固定的横幅放在屏幕上,它会在某一点后锁定dosbox
在一个较大的循环中包含以下代码的八个变体。在我添加之前,它运行良好;将横幅
打印到第七个内循环。实际上,它在下面的循环中的第一个LEA
上中断,在测试横幅时,该循环不存在
.REPEAT
LEA SI,SHAPE
MOV DH,ROW
MOV DL,COL
CALL CLEAR
CALL PUTSHAPE
;PRINT BANNER
LEA SI,BANNER
MOV DH,25
MOV DL,39
CALL PUTSHAPE
;END BANNER
MOV TIME, 1
MOV AH, 0
INT 1AH
ADD TIME, DX
.WHILE DX < TIME
MOV AH, 0
INT 1AH
.ENDW
ADD COL, 2
SUB ROW, 4
DEC D7
MOV CX, D7
MOV TIME, 0
.UNTILCXZ
。重复
莉丝,形状
莫夫DH,世界其他地区
MOV DL,COL
清除
称之为PUTSHAPE
;印刷横幅
列斯,班纳
莫夫DH,25
MOV DL,39岁
称之为PUTSHAPE
;端旗
移动时间,1
莫夫啊,0
INT 1AH
添加时间,DX
.而DX<时间
莫夫啊,0
INT 1AH
ENDW先生
加上第2列
第4小行
十二月七日
MOV CX,D7
移动时间,0
.UNTILCXZ
我是不是期望太多太快了?我尝试重新安排代码,在延迟之后调用第二个LEA
,并针对与基于文本的动画不完全相关的问题提出了许多其他建议,并且使用了我无法遵循的说明。我是一个认真的汇编初学者,从一本使用自定义库的书中学习。我在32位Win 7 Pro上从命令提示符下运行该程序,结果出现NTVDM.EXE错误。对代码的明显问题有什么想法或见解吗 我的实现的问题是循环的int1ah
(时钟)调用。当你不让Windows有时间做它的事情时,它会抱怨
解决方法是提供一个外部过程,调用INT 1AH
返回寄存器中的股票代码值。然后将其存储在一个值中,以确保它不会被过程调用破坏。最后,根据循环中包含的外部过程调用返回的值检查它,如
MOV TIME, 1 ;The value moved into time determines speed
CALL DELAY ;DELAY = INT 1AH call which puts the lower 1/2
ADD TIME, DX ;of the system clock into DX. Add it to TIME
.WHILE DX < TIME
CALL DELAY ;Loops call to the DELAY procedure testing DX
.ENDW ;against TIME + Original DELAY call
MOV时间,1;移动到时间中的值决定速度
呼叫延迟;延迟=INT 1AH呼叫,该呼叫将降低1/2
加时间DX;将系统时钟转换为DX。把它加到时间里
.而DX<时间
呼叫延迟;循环调用延迟程序测试DX
.ENDW;针对时间+原始延迟呼叫
将循环添加到DELAY.asm中的另一个子过程也可以