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中的另一个子过程也可以