Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在VESA图形模式下绘制像素_Assembly_X86_Nasm_X86 16_Vesa - Fatal编程技术网

Assembly 在VESA图形模式下绘制像素

Assembly 在VESA图形模式下绘制像素,assembly,x86,nasm,x86-16,vesa,Assembly,X86,Nasm,X86 16,Vesa,如何在VESA图形模式下绘制像素 我正在尝试中断10h函数0ch,但它不工作。怎么了 (注意:我用NASM语法编写了这段代码,并用qemu进行了测试) 即使在使用VESA VBE模式时,该功能也应工作 确保正确使用,像素的颜色进入al ;Set video mode mov ax, 4f02h mov bx, 105h int 10h ;Draw pixel mov ax, 0c09h ;09h = Blue mov cx, 2 mov dx, 3 xor bx, bx

如何在VESA图形模式下绘制像素

我正在尝试中断
10h
函数
0ch
,但它不工作。怎么了

(注意:我用NASM语法编写了这段代码,并用qemu进行了测试)

即使在使用VESA VBE模式时,该功能也应工作

确保正确使用,像素的颜色进入
al

;Set video mode
mov ax, 4f02h
mov bx, 105h
int 10h

;Draw pixel
mov ax, 0c09h    ;09h = Blue
mov cx, 2 
mov dx, 3     
xor bx, bx   
int 10h
从技术上讲,您应该使用来检索视频模式信息,包括模式属性字段的第2位(支持2个BIOS输出),以检查BIOS功能是否正常工作

使用BIOS功能写入高分辨率图像可能太慢,直接写入线性或窗口帧缓冲区可能值得投资。
写入线性帧缓冲区可能需要使用,使用窗口帧缓冲区可以避免这种情况。
这不仅速度较慢,而且更麻烦

这是一个非常简单的程序,用可怕的灰色填充30行。
注意为了简洁明了,我去掉了所有的检查,我做了很多假设,以避免做一些数学运算。
这是一种不好的做法,我只用于原型制作。
我强烈建议您阅读
Int 10h/AX=4F01h
返回的完整信息,并使用这些信息选择正确的窗口,进行正确的填充和计算

BITS 16

ORG 100h

mov ax, ds
mov es, ax 

;Set video mode
mov ax, 4f02h
mov bx, 105h
int 10h

;Get video mode info
mov ax, 4f01h
mov cx, 105h
mov di, modeInfo 
int 10h

;Assume first window is valid 
mov ax, WORD [es:modeInfo + 08h]
mov es, ax

;Example of how to change the window 
mov ax, 4f05h
xor bx, bx
mov dx, 5       ;This is granularity units
int 10h

xor di, di 
mov al, 0f1h
mov cx, 3*1024*20

rep stosb

;Wait for key
xor ax, ax
int 16h

;Restore DOS text mode
mov ax, 0003h
int 10h

;Exit
mov ax, 4c00h
int 21h

modeInfo    TIMES 256 db 0
这是NASM语法,我通常在DOS程序中使用TASM(出于喜爱),但这次我很匆忙。
结果是

请记住,通常每个扫描线都可以填充(在视频模式信息中返回扫描线的大小)。
对于1024像素宽的扫描线,使用3x8bpp,我们有3072字节/扫描线,因为它可以被4整除,所以不可能发生填充。
窗口开始地址以粒度单位给出(也可在视频模式信息中找到),总帧缓冲区为1024x768x3字节=2.25 MiB,假设没有填充。
窗口大小也可以在视频模式信息中找到

所有这些都足以写入帧缓冲区。
一旦设置了非真实模式,线性帧缓冲区更容易处理(填充仍然是需要考虑的方面)。

即使使用VESA VBE模式,该功能也应该工作

确保正确使用,像素的颜色进入
al

;Set video mode
mov ax, 4f02h
mov bx, 105h
int 10h

;Draw pixel
mov ax, 0c09h    ;09h = Blue
mov cx, 2 
mov dx, 3     
xor bx, bx   
int 10h
从技术上讲,您应该使用来检索视频模式信息,包括模式属性字段的第2位(支持2个BIOS输出),以检查BIOS功能是否正常工作

使用BIOS功能写入高分辨率图像可能太慢,直接写入线性或窗口帧缓冲区可能值得投资。
写入线性帧缓冲区可能需要使用,使用窗口帧缓冲区可以避免这种情况。
这不仅速度较慢,而且更麻烦

这是一个非常简单的程序,用可怕的灰色填充30行。
注意为了简洁明了,我去掉了所有的检查,我做了很多假设,以避免做一些数学运算。
这是一种不好的做法,我只用于原型制作。
我强烈建议您阅读
Int 10h/AX=4F01h
返回的完整信息,并使用这些信息选择正确的窗口,进行正确的填充和计算

BITS 16

ORG 100h

mov ax, ds
mov es, ax 

;Set video mode
mov ax, 4f02h
mov bx, 105h
int 10h

;Get video mode info
mov ax, 4f01h
mov cx, 105h
mov di, modeInfo 
int 10h

;Assume first window is valid 
mov ax, WORD [es:modeInfo + 08h]
mov es, ax

;Example of how to change the window 
mov ax, 4f05h
xor bx, bx
mov dx, 5       ;This is granularity units
int 10h

xor di, di 
mov al, 0f1h
mov cx, 3*1024*20

rep stosb

;Wait for key
xor ax, ax
int 16h

;Restore DOS text mode
mov ax, 0003h
int 10h

;Exit
mov ax, 4c00h
int 21h

modeInfo    TIMES 256 db 0
这是NASM语法,我通常在DOS程序中使用TASM(出于喜爱),但这次我很匆忙。
结果是

请记住,通常每个扫描线都可以填充(在视频模式信息中返回扫描线的大小)。
对于1024像素宽的扫描线,使用3x8bpp,我们有3072字节/扫描线,因为它可以被4整除,所以不可能发生填充。
窗口开始地址以粒度单位给出(也可在视频模式信息中找到),总帧缓冲区为1024x768x3字节=2.25 MiB,假设没有填充。
窗口大小也可以在视频模式信息中找到

所有这些都足以写入帧缓冲区。

一旦设置了非真实模式,线性帧缓冲区更容易处理(填充仍然是需要考虑的方面)。

请使用NASM语法或类似NASM的语法(TASM、MASM等)而不是GAS语法回答此问题。因为,我不能使用GNU汇编程序语法。@Juan:您要查找的术语是Intel和AT&T语法。无论如何,您可以通过使用
mov byte[bx],123
(或word或其他,取决于您设置的像素格式)将
ds
es
存储到视频内存中来绘制像素。2次向下表决?用户提供了1。他们想要达到的目标,2。他们尝试了什么,3。代码应该做什么的描述,4。代码不能画一个像素。看看公认的答案,似乎尝试的也不远了。。?说:“问题是我忘了把颜色放在ax的低位字节里。”这是没有意义的。不需要向上投票,但在我看来,问题和答案是一个有趣的问题和解决方案。@user176692:删除了我的向下投票。当我第一次读到这篇文章时,我忘记了有人试图画一个像素以及设置一个视频模式。(我不知道有一个
int10h
函数可以实现这个功能。不过,看起来调用它比存储到视频内存需要更多的代码。)仍然不是一个,只需阅读文档就可以解决。(除此之外,您可能不知道直接存储到视频RAM要比
int10h
快得多)请用NASM语法或类似NASM的(TASM、MASM等)而不是GAS语法回答此问题。因为,我不能使用GNU汇编程序语法。@Juan:您要查找的术语是Intel和AT&T语法。无论如何,您可以通过使用
mov byte[bx],123
(或word或其他任何东西,取决于