【发布时间】:2015-12-04 13:50:07
【问题描述】:
我今年开始在学校学习组装,而我们刚刚开始学习像素。
我们的老师给了我们一些代码并告诉我们乱来,他还告诉我们尝试在代码中实现延迟(ah = 86h | int 15h),但是当我尝试使用它时,位置和颜色一些像素发生了变化,我不明白为什么
代码:(只是一段代码,还有一些延迟后也被毁了)
mov cx, 20
add [y], 2
mov dx, [y]
paint1RowOf10:
mov bh, 0h
mov bx, cx
add [x], 1
mov cx, [x]
add [y], 4
mov dx, [y]
mov ax, [red]
mov ah,0ch
int 10h
; here is a delay part, it waits for 1 seconde
; from the help of assembly:
; INT 15h / AH = 86h - BIOS wait function.
;CX:DX = interval in microseconds (these are notes from my teacher)
mov ah, 86h
mov cx, 1
mov dx, 2
int 15h
mov cx, bx
loop paint1RowOf10
这是结果http://prntscr.com/9a8lpw 你能告诉我为什么会这样吗?因为据我所知,像素应该排成一行,而不是改变颜色。
【问题讨论】:
-
这看起来像一个问题
mov bh, 0h;,然后是mov bx, cx。 .首先,将int 10h/ah=0ch call的 0 移到 BH (BH=页码)。没关系,然后您就可以通过mov bx, cx覆盖所有 BX(包括 BH 和 BL)。 BL 和 BH 是 BX 寄存器的一部分。将某些内容移入 BX 会破坏 BH/BL 。将 CX 压入堆栈(稍后将其弹出)或使用 BX 以外的寄存器作为临时存储(在本例中为 SI 或 DI) 给出的代码看起来很安全。 -
我说看起来很安全,但您没有显示所有代码,因此它们可能不安全。您必须确保在您显示的代码(以及您没有使用的部分)中没有使用(或将被破坏)您使用的任何内容。最好只修改您的问题以显示您的所有代码,这将使其至少成为一个可验证的完整示例。
-
如果您想增加获得解决方案的机会,请发布您的所有代码,而不仅仅是 sn-p。尽管显示的代码中存在潜在问题,但如果不查看程序的其余部分,人们将很难提供帮助。
-
如果没有其余的代码,如果 X 和 Y 被定义为字节(而不是字),那么这里的情况可能会非常糟糕。如果您不觉得有必要提供所有代码,那么我建议您考虑使用调试器单步执行代码(Turbo 调试器做得很合理)
-
Int 15h/AH=86h在 DOSBox 中有错误。尝试使用视频模式 13 (09h) 而不是 19 (13h)。这在这里有效。
标签: assembly delay dos pixel 16-bit