DosBox有bug 15h啊= 86h

时间:2017-04-03 21:06:14

标签: assembly wait interrupt dos dosbox

我目前正在进行装配程序,但我需要让程序每隔一段时间等待一次
所以,我一直在使用int 15h / ah = 86h,但由于某种原因,DosBox给了我一个困难的时间,程序要么与像素(奇怪的颜色)混淆,要么在更坏的情况下;崩溃。

有人可以帮助我吗?

3 个答案:

答案 0 :(得分:5)

这是 0.74.3 版 DOSBox 中的一个错误。在他们的 break 处理函数的 switch 中缺少 int 15h,因此 ah=86h 处理函数落入 ah=87h, Copy Extended Memory,它从一些随机地址复制内存.见bios.cpp around line 663-681。 (如果他们打开了 -Wextra,他们就会收到编译器警告!)

这似乎是 fixed in trunk back in 2011 但不知何故从未发布过,我猜。

我已提交 bug #548 报告此事。

ah=87h 要复制的区域由 cx 中的计数和 es:si 指向的描述符表中的地址指定。如果这些地址超出范围,您应该只收到 Illegal read/write 警告,而没有其他有害行为,但如果它们碰巧指向实际内存,则可能会覆盖一些重要的内容。我怀疑在 OP 的测试中,目的地恰好指向视频内存,解释了“奇怪的颜色”

同理,如果 cx = 0 则不会复制任何内容并且不会出现错误。这证明了 rkhb 已删除答案中的解决方法,即在循环中执行小于 65 毫秒的延迟。

答案 1 :(得分:2)

我也有这个问题。基于Problems with BIOS delay function (INT 15h / AH = 86h)的答案,我能够确保在调用中断之前将AL设置为零,从而使其工作:

    mov     counter, 10
L1:

    mov     cx, 0007H
    mov     dx, 8480H
    mov     ah, 86h
    mov     al, 0
    int     15h

    mov     dl, '*'
    mov     ah, 02h
    int     21h

    dec     counter
    jnz     L1

(程序打印10 *,在每个之间暂停1秒。)如果没有'mov al,0',程序将挂起或给出其他未定义的行为,而DOSBox会发出非法的读/写消息。通过将al设置为零,程序可以正常工作,但奇怪的是,错误消息仍然出现在DOSBox日志中。

答案 2 :(得分:1)

.config(function(stateHelperProvider){ stateHelperProvider.setNestedState({ name: 'angeda', templateUrl: 'angeda.html', children: [ { name: 'mail', templateUrl: 'mail.html', children: [ { name: 'foo', templateUrl: 'foo.html' },{ name: 'bar', templateUrl: 'bar.html' } ] ] }); }); 替换为其他内容,例如等待" n"秒:

int 15h