这是 0.74.3 版 DOSBox 中的一个错误。存在丢失break在switch他们的int 15h处理功能,所以ah=86h处理器落空成ah=87h,复制内存扩展其拷贝一些随机地址的内存周围。参见bios.cpp第 663-681 行。(如果他们打开了,-Wextra他们会收到编译器警告!)
这似乎已在 2011 年的后备箱中得到修复,但我猜以某种方式从未将其发布到版本中。
我已提交错误 #548来报告此问题。
要复制的区域由指向的描述符表中ah=87h的计数cx和地址指定es:si。如果这些地址超出范围,您应该只会收到Illegal read/write警告,而不会出现其他有害行为,但如果它们碰巧指向实际内存,则可能会覆盖一些重要的内容。我怀疑在 OP 的测试中,目的地恰好指向视频内存,解释了“奇怪的颜色”
同理,如果cx = 0不复制任何内容,则不会出现错误。这证明了 rkhb 已删除答案中的解决方法,即在循环中执行小于 65 毫秒的延迟。
我也有这个问题。根据问题与 BIOS 延迟功能 (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
Run Code Online (Sandbox Code Playgroud)
(程序打印 10 个 *,每个 * 之间暂停 1 秒。)如果没有“mov al, 0”,程序将挂起或给出其他未定义的行为,同时 DOSBox 会发出非法读/写消息。通过将 al 设置为零,程序可以正常工作,但奇怪的是,错误消息仍然出现在 DOSBox 日志中。