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