gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:19:23 25 4
gpt4 key购买 nike

我有以下代码片段,它应该从 (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

最佳答案

您似乎偶然发现了 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。

关于assembly - 无法在 INT 10h/AH = 0Ch 的情况下在 Y 轴上绘制像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32932518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com