我有以下代码片段应该从(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
最佳答案 您似乎偶然发现了QEMU在我们的Ubuntu版本上使用的默认Plex86 VGA BIOS的错误.它可能是Plex86 VGA代码中的一个错误; SeaBIOS和Plex86之间的错误;可能是Ubuntu / Debian团队用来构建BIOS的选项存在问题.您可以通过修改Makefile来尝试使用Cirrus VGA BIOS,以便这一行:
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.