组装延迟 8086

CSc*_*f x 6 assembly delay

我正在尝试在我正在创建的游戏中延迟我的移动。我的问题是,每次我使用 int 1Ah 时,运动都会突然变得“生锈”(不是以恒定的直线运动),而我使用“nop”的延迟程序会产生稳固的运动而不是生锈。我的老师说我不能使用带有“nop”的循环,我不知道如何使用 1Ah 进行延迟并且看起来不错(不生锈)我正在使用图形模式和程序集 x86 谢谢。它工作得很好,但我的老师可能出于某种原因不喜欢它。

我的延迟过程:

proc delay   

delRep:
    push    cx  
    mov     cx, 0FFFFH 
delDec:
    dec     cx 
    jnz     delDec
    pop     cx
    dec     cx
    jnz     delRep
    ret
endp delay
Run Code Online (Sandbox Code Playgroud)

Jos*_*uez 4

这是使用int 15hwith的另一个“延迟” ah=86h,请在您的游戏中测试它:

\n\n
;DELAY 500000 (7A120h).\ndelay proc   \n  mov cx, 7      ;HIGH WORD.\n  mov dx, 0A120h ;LOW WORD.\n  mov ah, 86h    ;WAIT.\n  int 15h\n  ret\ndelay endp      \n
Run Code Online (Sandbox Code Playgroud)\n\n

使用系统时间的另一个“延迟”,它应该每秒重复大约 5 次:

\n\n
delay proc  \nsystem_time:   \n;GET SYSTEM TIME.\n  mov  ah, 2ch\n  int  21h ;RETURN HUNDREDTHS IN DL.\n;CHECK IF 20 HUNDREDTHS HAVE PASSED. \n  xor  dh, dh   ;MOVE HUNDREDTHS...\n  mov  ax, dx   ;...TO AX REGISTER.\n  mov  bl, 20\n  div  bl       ;HUNDREDTHS / 20.\n  cmp  ah, 0    ;REMAINDER.\n  jnz  system_time\n  ret\ndelay endp  \n
Run Code Online (Sandbox Code Playgroud)\n\n

接下来是第三个延迟(以为单位) ,它需要一个变量:

\n\n
seconds db 0  ;\xe2\x97\x84\xe2\x96\xa0\xe2\x96\xa0 VARIABLE IN DATA SEGMENT.\n\ndelay proc  \ndelaying:   \n;GET SYSTEM TIME.\n  mov  ah, 2ch\n  int  21h      ;\xe2\x97\x84\xe2\x96\xa0\xe2\x96\xa0 RETURN SECONDS IN DH.\n;CHECK IF ONE SECOND HAS PASSED. \n  cmp  dh, seconds  ;\xe2\x97\x84\xe2\x96\xa0\xe2\x96\xa0 IF SECONDS ARE THE SAME...\n  je   delaying     ;    ...WE ARE STILL IN THE SAME SECONDS.\n  mov  seconds, dh  ;\xe2\x97\x84\xe2\x96\xa0\xe2\x96\xa0 SECONDS CHANGED. PRESERVE NEW SECONDS.\n  ret\ndelay endp      \n
Run Code Online (Sandbox Code Playgroud)\n