assembly – 无法在INT 10h / AH = 0Ch的Y轴上绘制像素

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

《assembly – 无法在INT 10h / AH = 0Ch的Y轴上绘制像素》

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

点赞