如何在程序集中处理动画循环

时间:2012-12-09 04:14:36

标签: assembly

我正在组装基于文本的动画,其中需要大量的屏幕刷新以使其尽可能平滑并模拟弹跳物理。我使用int 1ah调用来控制屏幕刷新延迟,并使形状看起来好像它减慢到达其峰值并在其下降时加速。每个CALL CLEAR之后还会有一个单独的横幅放到屏幕上。

我编写了处理移动形状代码的代码,它按预期工作。当我添加了在屏幕上放置固定横幅的附加代码时,它会在某个点之后锁定dosbox。

更大的循环中包含以下代码的八种变体。它运行正常,直到我将;PRINT BANNER添加到第七个内循环。实际上,它打破了下面循环中的第一个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

我在这里期待太快了吗?我试图重新安排代码,在延迟之后调用第二个LEA,并提出一系列其他建议,解决与基于文本的动画不完全相关的问题,并且明确使用我无法遵循的说明。我是一个认真的集会初学者,从一本利用自定义库的书中学习。我在命令提示符下运行的32位Win 7 Pro上尝试了该程序,并出现了NTVDM.EXE错误。关于代码明显问题的任何想法或见解?

1 个答案:

答案 0 :(得分:1)

我的实现问题是循环INT 1AH(时钟)调用。当你不允许它做一些事情时,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   

将循环添加到DELAY.asm中的另一个子过程也可以。