0

我正在组装一个基于文本的动画,其中需要大量的屏幕刷新以使其尽可能平滑并模拟弹跳物理。我使用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 错误。关于代码明显问题的任何想法或见解?

4

1 回答 1

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

于 2013-01-06T02:49:36.047 回答