assembly 程序集中中断10h 0x4F05:为什么这次行动失败了?

yhived7q  于 2023-03-23  发布在  其他
关注(0)|答案(1)|浏览(130)
mov ax, 0x4F05 
xor bh, bh 
mov dx, 1022
int 0x10

当我调用int 10h的函数4F05h时,这个函数显示了操作中的错误。
ah为1,表示根据文档存在错误
我启动了视频模式:8107h,带4F02
我不明白为什么它给我一个错误
我试图改变dx的值或改变视频模式,把另一个,我也在谷歌上搜索但没有什么结论性的

w80xi6nr

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的值。

相关问题