使用INT 10h / AH = 0Ch

时间:2015-10-04 10:33:36

标签: assembly graphics x86-16 low-level i386

我有以下代码片段应该从(30,100)开始绘制对角线,但是,它只是在屏幕顶部绘制一条水平线,如下所示:

enter image description here

为了测试代码,我运行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

1 个答案:

答案 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。