【发布时间】:2016-01-01 03:50:50
【问题描述】:
我有以下代码片段,它应该从 (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
【问题讨论】:
-
无法再现水平线。对我来说很好。
-
@cad 你在使用我的 Makefile 和
make run吗? -
是的,一样。它在 ArchLinux、Linux 4.1.6、64 位上。
-
也许你应该在另一个模拟器上测试它,比如 bochs。
-
@cad 我正在运行 Ubuntu 15.04、Linux 3.19、64 位。我会尝试
bochs,但设置起来似乎更困难,而且我没有找到任何让它运行的指南。我想继续使用qemu。我相信使用另一个-display可能会解决我的问题,但似乎最好的选择-display gtk已被禁用。
标签: assembly graphics nasm x86-16 bootloader