Assembly 在16位汇编中写入图形像素

Assembly 在16位汇编中写入图形像素,assembly,x86,16-bit,vga,Assembly,X86,16 Bit,Vga,为了教育目的,我正在尝试开发自己的非常基本的操作系统。在编写内核时,我尝试将颜色设置为屏幕上的一些像素,以使其看起来更好,但失败了 我使用INT 10h和AH=0CH,视频模式13h 320x200图形,256色,1页,并尝试了几种其他模式,如01h和03h,但它们都不起作用 这是我的完整代码: ;set video mode mov ah, 00h mov al, 13h int 10h ;write pixels on screen mov ah, 0ch mov bh, 0 mov d

为了教育目的,我正在尝试开发自己的非常基本的操作系统。在编写内核时,我尝试将颜色设置为屏幕上的一些像素,以使其看起来更好,但失败了

我使用INT 10h和AH=0CH,视频模式13h 320x200图形,256色,1页,并尝试了几种其他模式,如01h和03h,但它们都不起作用

这是我的完整代码:

;set video mode
mov ah, 00h
mov al, 13h

int 10h

;write pixels on screen
mov ah, 0ch
mov bh, 0
mov dx, 5
mov cx, 5
mov al, 0100b

int 10h
我的代码有什么问题?

编辑: 您的代码在我的linux机器上dosbox中测试的DOS中工作

因此,在这篇文章之前,您的引导过程和代码可能没有遇到问题,或者您的内核/环境设置阻止int 10h BIOS中断工作。您不是偶然破坏了IVT吗?。或者您的引导加载程序已经超过510B大小,所以引导扇区看起来不像您期望的那样

根据这一点,当您将自己的代码或本示例放入磁盘上的第一个扇区,并在扇区末尾用0xAA55标记时,它应该可以工作,并且在按下末尾的键后可能会崩溃

您可能还想试试他们编写hello world的引导加载程序示例

要测试对VRAM的直接写入,您可以在我的linux机器上的dosbox中使用类似的代码,因此如果您的操作系统设置了类似的16b环境并允许BIOS中断:

palette.asm:
以下代码以红色显示一个像素。颜色,nr,即4。您必须使用NASM编译它,然后它才能工作

mov ax,13h        
int 10h             
mov ax,0A000h        
mov es,ax             
mov ax,32010          
mov di,ax             
mov dl,4             
mov [es:di],dx        
int 10h

嗯,视频模式03h是一种文本模式,有80列25行。你说你想要13h模式,但你的代码是03h。我认为16b VGA可以安全地假设这是x86,但标签和完整信息肯定会有帮助。你确定这是你的完整代码吗?告诉我们有关您正在使用的编译器的一些信息。删除数百行中的大部分,只留下显示像素所需的代码,直到您在屏幕上看到它为止。您是否验证过这些代码行是否实际已被访问,例如,通过使用Bochs内部调试器单步执行?这里排除原因。虽然直接写入VRAM绝对是生产操作系统的一种方式,但OP的一种是教育性的。我说,让她暂时坚持使用int10h。@SevaAlekseyev:教育操作系统的一个主要问题是,它们往往只教人们如何以不适合真正操作系统的方式做错事情。这让我怀疑,一个学过错误的人是比一个什么都没学的人更好,还是更糟。我在这行中有错误mov-es:[di],ax-mov-es:[di+2],ax-mov-es:[di+4],al。。它说操作码和密码的组合无效operands@Kordy:不同的汇编程序需要不同的语法,即使它们在同一个系列中-例如intel语法。对于NASM和YASM,请尝试mov[es:di]、ax等,并将段放在括号内。@Kordy抱歉,您没有指定您正在使用的汇编器,即使您愿意,因为我自己没有尝试编译它,我也可能会犯同样的错误—反正TASM和NASM的语法混淆了@SevaAlekseyev好吧,我个人认为在使用特定的gfx模式时,使用BIOS的draw pixel调用没有任何重要的价值,甚至没有教育意义。您已经需要使用int 10h来设置模式,因此直接VRAM绘图实际上是在教您一些新的东西。此外,我认为,制作自己的图形效果会带来一些乐趣…:在x86上学习ASM是再好不过的了。
mov ax,13h        
int 10h             
mov ax,0A000h        
mov es,ax             
mov ax,32010          
mov di,ax             
mov dl,4             
mov [es:di],dx        
int 10h