基本上,我必须"画"使用汇编代码在我的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
答案 0 :(得分:2)
fillbuf
需要以ret
指令结束。
现在发生的是你正在调用fillbuf
,它显示第一个文本,然后它继续执行程序结束后的随机字节,这基本上就是崩溃。它永远不会返回,所以没有别的东西被打印出来。
随机字节被解释为指令,并且因为ds:已经指向视频ram,视频ram接收到一些随机垃圾,因此你看到可爱的“无意的随机分类字母”。请记住未来,当你看到这些时,你就会崩溃。
此外,由于您的程序崩溃,您很可能会收到某种错误,但您没有告诉我们任何相关信息。在有关stackoverflow的问题时,请提及您可能会看到的任何错误消息,它们往往有点相关。
此外,由于您直接访问视频RAM,因此您无需使用光标。如果要使用在光标位置发出文本的其他中断,则需要将光标放在某个位置。但是你没有这样做,所以光标对你没用。如果您的教师需要您使用光标,那么他也希望您使用一些中断而不是直接访问视频RAM。