先展示结果
VBE功能调用和返回值
VBE功能调用的共同点有5个:
1.AH必须等于4FH,表明是VBE标准;
2.AL等于VBE功能号,其中,0<=AL<=0Bh;
3.BL等于子功能号,也可以没有子功能;
4.调用int 10h;
5.返回值。
VBE功能调用的返回值一般均在AX中,其含义如下:
1.AL=4FH:支持该功能;
2.AL!=4FH:不支持该功能;
3.AH=00H:功能调用成功;
4.AH=01H:功能调用失败;
5.AH=02H:当前的硬件配置不支持该功能;
6.AH=03H:当前的显示模式不支持该功能。
它适用于所有VBE功能调用和VBE扩展功能调用,对VBE功能调用一般需检查AX中返回值,常见的返回值如下:
1.功能调用成功,返回AX=004FH;
2.不支持该功能,一般返回AX=4F00H;
3.支持该功能但该功能调用失败,返回AX=014FH。
VBE功能00h:返回VBE信息
入口:
AX=4F00H
ES:DI=指向VBE信息块的指针
出口:
AX=VBE返回值
其中,VBE信息块数据结构如下:
// vbe info:VGA图形系统相关参数
typedef struct vbe_info {
char VBESignature[4]; // 字符串"VESA"
unsigned VBEVersion; // VBE版本号,BCD码
char /*far*/ *OEMStringPtr; // 指向OEM厂商的标志串的指针
long Capabilities; // 显示卡特性
char /*far*/ *VideoModePtr; // 指向所支持显示模式列表的指针
unsigned VRAMMemory; // 显示内存大小,单位为64KB
// 以下为VESA VBE 2.0版本以上定义
unsigned OemSoftwareRev; // VBE软件的OEM修订版本号,BCD码
char /*far*/ *OemVendorNamePtr; // 指向显示卡制造厂商的字符串指针
char /*far*/ *OemProductNamePtr; // 指向显示卡制造商的字符串的指针
char /*far*/ *OemProductRevPtr; // 指向显示卡修订版本号或唱片等级的字符串的指针
char reserved[222]; // 保留
char OEMData[256]; // VESA2.0版以上定义
} __attribute__((packed)) VBEINFO;
BOOTINFO,传递一些参数
// boot info:VGA图形系统相关参数
typedef struct boot_info { /* 共 12 个字节 */
char cyls;
char leds;
char vmode;
char reserve;
short scrnx;
short scrny;
short di;
char *vram;
} __attribute__((packed)) BOOTINFO;
BOOT中进行的操作
; 在boot中给c传递BOOTINFO参数
; // boot info:VGA图形系统相关参数
; typedef struct boot_info { /* 共 12 个字节 */
; char cyls;
; char leds;
; char vmode;
; char reserve;
; short scrnx;
; short scrny;
; char *vram;
; } __attribute__((packed)) BOOTINFO;
; 结构体的起始位置是0x0ff0
CYLS equ 0x0ff0
LEDS equ 0x0ff1
VMODE equ 0x0ff2
SCRNX equ 0x0ff4
SCRNY equ 0x0ff6
DI_V equ 0x0ff8
RET_V equ 0x0ffe
;VRAM equ 0x0ff8
; 符号定义 ------------------------------------------------------------------------------------------------------------------------------------------------------
; 符号定义结束
org 7c00h
mov ax, cs
mov ds, ax
mov es, ax
......
;;;;;;;;;;;;;;;;;;;;;;;;;;;设置VGA图形格式
;mov al, 0x13
;mov ah, 0x00
;int 0x10
mov ax, 4f00h
; 记录画面模式
;mov BYTE[VMODE], 8
;mov WORD[SCRNX], 320
;mov WORD[SCRNY], 200
mov WORD[SCRNX], ax
mov WORD[SCRNY], es
mov di, RET_V
mov WORD[DI_V], di
mov ax, 4F00H
int 10h
mov BYTE[VMODE], al
mov BYTE[LEDS], ah
;mov DWORD[VRAM], 0x000a0000
mov BYTE[VMODE], al
mov BYTE[LEDS], ah
在BOOT中,将BOOTINFO写在0x0ff0位置处。
ES的值是0,
mov di, RET_V
将返回的VBE信息块的指针写在0x0ffe
C中进行打印操作
BOOTINFO *binfo = (BOOTINFO *) 0x0ff0; // 在boot中写入
// 打印寄存器的值
sprintf(buf, "[ax: %x], [es: %x], [di: %x]", binfo->scrnx, binfo->scrny, binfo->di);
print_str_fix_pos((80*21+0)*2, buf);
sprintf(buf, "return [al: %x], [ah: %x]", binfo->vmode, binfo->leds);
print_str_fix_pos((80*22+0)*2, buf);
VBEINFO *vbeInfo = (VBEINFO *) 0x0ffe; // 在boot中写入
buf[0] = vbeInfo->VBESignature[0];
buf[1] = vbeInfo->VBESignature[1];
buf[2] = vbeInfo->VBESignature[2];
buf[3] = vbeInfo->VBESignature[3];
buf[4] = '\0';
print_str_fix_pos((80*23+0)*2, buf);
BOOTINFO *binfo = (BOOTINFO *) 0x0ff0; // 在boot中写入
VBEINFO *vbeInfo = (VBEINFO *) 0x0ffe; // 在boot中写入
在C中获得结构体指针。
结论:VirtualBox是支持VESA和SVGA的。