我有以下代码片段应该从(30,100)开始绘制对角线,但是,它只是在屏幕顶部绘制一条水平线,如下所示:
为了测试代码,我运行make run
。
这是loader.asm
:
BITS 16
; ----------------------------------------------------------------------
_start:
mov ax, 07C0h
add ax, 288
mov ss, ax ; ss = stack space
mov sp, 4096 ; sp = stack pointer
mov ax, 07C0h
mov ds, ax ; ds = data segment
call print_pixel
jmp $ ; infinite loop
; ----------------------------------------------------------------------
print_pixel:
; changing video mode to graphical
mov ah, 00h ; set video mode
mov al, 13h ; 13h - graphical mode.
; 40x25. 256 colors.;320x200 pixels. 1 page.
int 10h ; call
; drawing random pixels
mov ah, 0Ch ; change color for a single pixel
mov al, 0000b ; color
mov bh, 0 ; page number
mov cx, 30 ; x
mov dx, 100 ; y
int 10h ; paint 1st pixel
.repeat:
inc al ; change color
inc cx ; go one pixel right
inc dx ; go one pixel down
int 10h ; paint
cmp al, 1111b
je .done ; last color was painted
jmp .repeat
.done:
ret
times 510 - ($ - $$) db 0 ; padding with 0 at the end
dw 0xAA55 ; PC boot signature
这是Makefile
:
.PHONY: build run
build: image.flp
run: build
qemu-system-i386 -fda image.flp
image.bin: loader.asm
nasm -f bin -o image.bin loader.asm
image.flp: image.bin
dd status=noxfer conv=notrunc if=image.bin of=image.flp
答案 0 :(得分:1)
您似乎偶然发现了QEMU在我们的Ubuntu版本上使用的默认 Plex86 VGA BIOS 的错误。它可能是Plex86 VGA代码中的一个错误; SeaBIOS和Plex86之间的错误;可能是Ubuntu / Debian团队用来构建BIOS的选项存在问题。你可以尝试使用 Cirrus VGA BIOS 修改你的Makefile
以便这一行:
qemu-system-i386 -fda image.flp
更改为:
qemu-system-i386 -fda image.flp -vga cirrus
我碰巧在Ubuntu 15.04上运行你的代码并且有类似的行为。看来 DX 寄存器的内容不符合(包含Y轴值)。
虽然在这种情况下不是您问题的一部分 - 在使用int 10h
时,您不应该假设 AX / AH / AL 寄存器将被保留。有些旧的VGA BIOS可能会破坏它。
我还在我的Debian Jessie系统上发现了你的代码最初工作,如果我通过运行这个命令专门使用 Plex86 VGA BIOS ,它就会失败:
qemu-system-i386 -fda image.flp -vga std
看来这个问题不是Ubuntu特有的。它也会影响Debian。看来Debian可能默认使用不同的VGA BIOS。