光标不会移动BIOS中断(x86汇编/ NASM)

时间:2015-12-09 21:44:22

标签: assembly x86 nasm dosbox

基本上,我必须"画"使用汇编代码在我的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

1 个答案:

答案 0 :(得分:2)

fillbuf需要以ret指令结束。

现在发生的是你正在调用fillbuf,它显示第一个文本,然后它继续执行程序结束后的随机字节,这基本上就是崩溃。它永远不会返回,所以没有别的东西被打印出来。

随机字节被解释为指令,并且因为ds:已经指向视频ram,视频ram接收到一些随机垃圾,因此你看到可爱的“无意的随机分类字母”。请记住未来,当你看到这些时,你就会崩溃。

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

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