Interrupt 10h 0x4F05 in assembly: 为什么运行失败?

问题描述 投票:0回答:1
mov ax, 0x4F05 
xor bh, bh 
mov dx, 1022
int 0x10

当我调用int 10h的函数4F05h时,这个显示操作错误。

ah 是 1 这意味着根据文档有错误

我激活了视频模式:8107h 和 4F02

我不明白为什么它给我一个错误

我试过改变dx的值或改变视频模式,换一个,我也谷歌搜索但没有定论

assembly x86
1个回答
1
投票

首先;有 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 和 8 位索引颜色”,
dx
的最大合理值将是
(1280*1024*1 - 1) / window_granularity
,或者,对于 64 KiB 窗口粒度,
dx
的最高值将是 19(允许访问帧缓冲区中从 0x130000 到 0x13FFFF 的偏移量,偏移量 0x13FFFF 处的字节是帧缓冲区中存在的最后一个字节)。

注 2:VBE 标准早期版本的固定模式编号在 VBE 2.0(1994 年)中已弃用,因此“模式 0x107”(理论上)可以是任何视频模式。

当然,所有这一切都意味着(对于轻度可移植的代码)你不能只对任何东西使用硬编码值。您必须搜索所需的模式(使用函数 0 中的模式编号列表和函数 1 中每种模式的详细信息),并且必须使用从函数获得的视频模式信息数据结构中的“WinGranularity”字段1 计算

dx
.

的值
© www.soinside.com 2019 - 2024. All rights reserved.