BIOS 中断时光标不会移动 (x86 assembly/NASM)

Cursor won't move upon BIOS interrupt (x86 assembly/NASM)

基本上,我必须 "paint" 使用汇编代码在我的 DOS Box 中制作一张房子的简单图片。这张照片的一部分涉及背景中的天空和下面的一片绿色草地。我被告知我可以通过任何我想要的方法来完成此操作,但我从未被教导过太多关于 x86 图形模式的知识。所以,我决定以模式 3(80x25 文本模式)完成目标。基本上,我使用循环结构来打印带有高亮显示的空白区域。

我已经成功地绘制了天空(以及屏幕上一些无意中随机排列的字母)。然而,我的下一个指令是将光标移动到屏幕的某个位置,然后打印草地部分,但这并没有发生。我不确定 NASM 是否只是忽略了该指令,它是否无法访问它,或者我的代码是否有误。任何见解将不胜感激。

这是我的代码:

org 100h

section .text

mov ah, 0       ;change to 80x25 color text mode
mov al, 3
int 10h

drawSky:

mov ax, 0b800h  ;color activate display page
mov ds, ax
mov cx, 2000    ;80x25 = 2000 words
mov di, 0
mov ax, 3320h   ;blank spaces with blue background
call    fillbuf

drawGrass:

mov ah, 2       ;move cursor
xor bh, bh      ;page number 0
mov dh, 14h     ;move to row 20
mov dl, 0h      ;move to column 0
int 10h

mov ax, 0b800h  ;color activate display page
mov ds, ax
mov cx, 1000
mov di, 0
mov ax, 2220h   ;blank spaces with blue background
call    fillbuf

fillbuf:

mov [di], ax    ;character in al, attribute in ah
add di, 2       ;go to next word
loop    fillbuf

fillbuf 需要以 ret 指令结束。

现在发生的事情是您正在调用 fillbuf,它显示第一个文本,然后继续执行程序结束后的随机字节,这基本上是崩溃。它从不 returns,因此不会打印任何其他内容。

随机字节被解释为指令,并且由于 ds: 已经指向视频 ram,视频 ram 收到一些随机垃圾,因此您看到的可爱 "unintentional randomly assorted letters"。请记住未来,当您看到这些时,您会崩溃。

此外,由于您的程序崩溃,您很可能收到某种错误,但您没有告诉我们任何相关信息。在询问有关 Whosebug 的问题时,请务必提及您可能看到的任何错误消息,它们往往有点相关。

此外,由于您是直接访问视频 ram,因此您对光标没有任何用处。如果要使用在光标位置发出文本的其他中断,则需要将光标放在某个位置。但是你没有那样做,所以光标对你没有用。如果你的导师要求你使用光标,那么他也希望你使用一些中断而不是直接访问视频 ram。