首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

彩色文本模式下,BIOS直接写屏幕缓冲区,不能正常显示。不知道是不是VESA不兼容的有关问题?请高人进来指点一下

2013-03-26 
彩色文本模式下,BIOS直接写屏幕缓冲区,不能正常显示。不知道是不是VESA不兼容的问题?请高人进来指点一下。如

彩色文本模式下,BIOS直接写屏幕缓冲区,不能正常显示。不知道是不是VESA不兼容的问题?请高人进来指点一下。
如题,之前用int10h的0c功能打点的问题已经解决了。现在向缓冲区直接写,可是又碰到这样的问题。
同样的代码在保护模式下可以正常显示(2行字符串均可)。
而在实模式下,只能显示利用int10h,功能13的写字符串。直接写显存不成功。
不知道问题出在哪里,烦请高人指点下!谢谢!


主要代码如下:


;---------------------------------------------------
screen_segment  dw0;屏幕缓冲区段地址
screen_offsetdw0;屏幕缓冲区偏移地址
program_screendb'This is a test!'
some_stringdb'This some_string!'
;---------------------------------------------------
;该程序段可直接向屏幕缓冲区写进所要显示的内容
;---------------------------------------------------
write_screenprocnear
movax,3h;设置为80列*25行彩色文本模式
int10h

andal,7fh
movdx,0b800h;b800为彩色图形显示缓冲区的段地址
;将此处改成VESA标准的起始地址0A000h也不行
video_skip:
moves,dx
xordi,di
movah,0feh;获取屏幕地址
int10h

movcs:screen_segment,es;保存屏幕缓冲区的地址
movcs:screen_offset,di

moves,cs:screen_segment;屏幕缓冲区驻留地址
;如果把此处改成b800也不能显示
movdi,cs:screen_offset
movax,code_seg
movds,ax ;程序屏幕的地址
movsi,offset program_screen  
movcx,15;要写的屏幕的大小
moval,3h
cld
next_char:
movsb;存储字符的ascii码
stosb;存储所要显示的属性
loopnext_char

;---------------------------------------
;以下为测试是否进入彩色显示模式
;经测试在保护模式/实模式下均可以正常显示
movax,cs
moves,ax
movax,1300h;写串
movbh,0;页号
movbl,13h;字符属性
movcx,17;字符串的长度
movdh,10;起始行
movdl,0;起始列
leabp,some_string;字符串偏移地址
int10h
;---------------------------------------

ret
write_screenendp




现在连彩色文本都搞不定,何时才能搞定彩色图形啊。漫漫长路,望高人指点下!
[解决办法]
1。 试试基地址改成B000
2. 图形和字符串是彻底的两码子事
[解决办法]
我记得文本模式与图形模式使用的是不同的Address


0xB800是文本的
图形的是多少我就忘了
[解决办法]
主要问题在于你取屏幕缓冲区偏移地址的方法错了,这个值可以从BIOS数据区0040:004e处的一个word取得,当然你取得显示页号(int 10h ah=0fh 返回的bh值)自己计算也可以。
不用计算也可以,因为重设显示方式后,默认就是第0页(偏移为0)。

[解决办法]
友情up
[解决办法]
不懂,帮顶
[解决办法]
不懂,帮顶
[解决办法]
稍加修改:

code segment para public 'code'

     assume cs:code, ds:code

seg0040 equ 0040h
segb000 equ 0b000h
segb800 equ 0b800h
ptr_curpagestart equ 004eh
ptr_crtcbase equ 0063h

screen_segment  dw    0    ;屏幕缓冲区段地址
screen_offset    dw    0    ;屏幕缓冲区偏移地址
program_screen    db    'This is a test!'    
some_string    db    'This some_string!'

getvideoparams proc near
    push ds
    push cs
    pop ds
    mov ax,seg0040
    mov es,ax
    mov ax,segb800


    cmp word ptr es:[ptr_crtcbase],03b4h
    jne __saveparams
    mov ax,segb000
__saveparams:
    mov screen_segment,ax
    mov ax,es:[ptr_curpagestart]
    mov screen_offset,ax
    pop ds
    ret
getvideoparams endp

write_screen    proc    near
    mov    ax,3h    ;设置为80列*25行彩色文本模式
    int    10h
    
    call   getvideoparams

    mov    es,cs:screen_segment    ;屏幕缓冲区驻留地址
    mov    di,cs:screen_offset
    mov    ax,code
    mov    ds,ax ;程序屏幕的地址
    mov    si,offset program_screen  
    mov    cx,15        ;要写的屏幕的大小
    mov    al,3h
    cld
next_char:
    movsb    ;存储字符的ascii码
    stosb    ;存储所要显示的属性
    loop    next_char

    ;---------------------------------------

    mov    ax,cs
    mov    es,ax
    mov    ax,1300h    ;写串
    mov    bh,0        ;页号
    mov    bl,13h        ;字符属性
    mov    cx,17        ;字符串的长度
    mov    dh,10        ;起始行
    mov    dl,0        ;起始列
    lea    bp,some_string    ;字符串偏移地址
    int    10h
    ;---------------------------------------

    ret
write_screen    endp

start:
    call write_screen
    mov ax,4c00h
    int 21h

code ends

end start

热点排行