assembly x86组件中的睡眠功能

rxztt3cl  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(103)

我做了一个多人游戏,并实现了自己的中断来处理多人输入,但有一个问题,每当我执行一个功能的睡眠或等待时间的程序崩溃,这是最后一个程序崩溃的程序

my_delay proc 
push ax 
; Input: CX = delay count
    ; Output: None
    ; Description: Pauses execution for approximately CX * 55 ms
    mov cx,delay
    mov al,0
    mov ah, 86h     ; INT 21h, Function 86h - "wait" or "sleep"
    int 21h
    pop ax
  ret 
my_delay endp

字符串

ktecyv1j

ktecyv1j1#

; Input: CX = delay count
mov cx,delay

字符串
直接从 delay 变量本身加载CX与关于CX是proc的参数的评论不太一致。

; Description: Pauses execution for approximately CX * 55 ms


CX表示约65 ms的倍数。

mov al,0


这个函数不依赖于AL,但是DX,你应该已经初始化了。微秒的数量应该在组合CX:DX中。

int 21h


该函数不属于DOS API。它是属于int 15h的sysyem BIOS函数。
你在DOSBox中运行你的程序吗?如果你这样做了,那么你就知道DOSBox在这个特定的功能上是有缺陷的。

print:
    mov  ah, 09h
    int  21h
;;;    mov  cx, 18            ; 1 second
;;;    call waitTicks
    mov  cx, 15           ; 1 second == 1000000 µsec
    mov  dx, 16960
    mov  ah, 86h
    int  15h
    jmp  mainLoop


我在回答你之前的问题时修改了代码,在汇编x86中处理09,今天它工作得很好!在过去,这并不总是正确的。请参阅https://codereview.stackexchange.com/questions/101035/a-low-tech-approach-to-measuring-game-speed,它使用了一种替代方法来实现(非常)短的延迟。
另一个解决方法是 * 永远不要在CX非零的情况下调用此BIOS函数 *:

; IN (cx:dx) OUT () MOD (ax,cx)
MicroWait:
    jcxz .b
    push dx
    mov  dx, 65535
.a: push cx
    xor  cx, cx
    mov  ah, 86h
    int  15h
    pop  cx
    loop .a
    pop  dx
.b: mov  ah, 86h
    int  15h
    ret
; ----------------------

相关问题