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。
基本上,我必须 "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。