mov ax, 0x4F05 xor bh, bh mov dx, 1022 int 0x10
当我调用int 10h的函数4F05h时,这个函数显示了操作中的错误。ah为1,表示根据文档存在错误我启动了视频模式:8107h,带4F02我不明白为什么它给我一个错误我试图改变dx的值或改变视频模式,把另一个,我也在谷歌上搜索但没有什么结论性的
w80xi6nr1#
首先,有2个显示窗口,您需要告诉它您正在更改哪个窗口。这可以通过将bl设置为0(“窗口A”)或1(“窗口B”)来完成。注1:Ralph Brown的中断列表是错误的-它说bl是一个输出参数,而它是一个输入参数。请使用(适当版本的)实际VBE规范作为参考。第二,不同的显卡有不同的窗口粒度,但通常是64 KiB。dx中的值是“窗口粒度单位”;这意味着你的mov dx,1022可能是像“设置窗口在视频内存中的字节偏移量1022*64*1024 = 66977792开始”。这需要在帧缓冲区的某个地方;并且假设(参见注解2)如果使用“1280 x 1024 with 8-bit indexed color”,则dx的最大正常值为(1280*1024*1 - 1) / window_granularity,或者,如果窗口粒度为64 KiB,则dx为19(允许访问帧缓冲器中从0x 130000到0x 13 FFFF的偏移,偏移0x 13 FFFF处的字节是帧缓冲器中存在的最后一个字节)。注2:VBE标准早期版本的固定模式编号在VBE 2.0(1994年)中被弃用,因此“模式0x 107”可以(理论上)是任何视频模式。当然,所有这些都意味着(对于稍微可移植的代码)你不能只使用硬编码的值。你必须搜索你想要的模式(使用函数0的模式编号列表和函数1的每个模式的详细信息),并且你必须使用从函数1获得的视频模式信息数据结构中的“WinGranularity”字段来计算dx的值。
bl
dx
mov dx,1022
1022*64*1024 = 66977792
(1280*1024*1 - 1) / window_granularity
1条答案
按热度按时间w80xi6nr1#
首先,有2个显示窗口,您需要告诉它您正在更改哪个窗口。这可以通过将
bl
设置为0(“窗口A”)或1(“窗口B”)来完成。注1:Ralph Brown的中断列表是错误的-它说
bl
是一个输出参数,而它是一个输入参数。请使用(适当版本的)实际VBE规范作为参考。第二,不同的显卡有不同的窗口粒度,但通常是64 KiB。
dx
中的值是“窗口粒度单位”;这意味着你的mov dx,1022
可能是像“设置窗口在视频内存中的字节偏移量1022*64*1024 = 66977792
开始”。这需要在帧缓冲区的某个地方;并且假设(参见注解2)如果使用“1280 x 1024 with 8-bit indexed color”,则dx
的最大正常值为(1280*1024*1 - 1) / window_granularity
,或者,如果窗口粒度为64 KiB,则dx
为19(允许访问帧缓冲器中从0x 130000到0x 13 FFFF的偏移,偏移0x 13 FFFF处的字节是帧缓冲器中存在的最后一个字节)。注2:VBE标准早期版本的固定模式编号在VBE 2.0(1994年)中被弃用,因此“模式0x 107”可以(理论上)是任何视频模式。
当然,所有这些都意味着(对于稍微可移植的代码)你不能只使用硬编码的值。你必须搜索你想要的模式(使用函数0的模式编号列表和函数1的每个模式的详细信息),并且你必须使用从函数1获得的视频模式信息数据结构中的“WinGranularity”字段来计算
dx
的值。