如题,之前用int10h的0c功能打点的问题已经解决了。现在向缓冲区直接写,可是又碰到这样的问题。
同样的代码在保护模式下可以正常显示(2行字符串均可)。
而在实模式下,只能显示利用int10h,功能13的写字符串。直接写显存不成功。
不知道问题出在哪里,烦请高人指点下!谢谢!
主要代码如下:
- Assembly code
;---------------------------------------------------screen_segment dw 0 ;屏幕缓冲区段地址screen_offset dw 0 ;屏幕缓冲区偏移地址program_screen db 'This is a test!' some_string db 'This some_string!';---------------------------------------------------;该程序段可直接向屏幕缓冲区写进所要显示的内容;---------------------------------------------------write_screen proc near mov ax,3h ;设置为80列*25行彩色文本模式 int 10h and al,7fh mov dx,0b800h ;b800为彩色图形显示缓冲区的段地址 [color=#FF0000];将此处改成VESA标准的起始地址0A000h也不行[/color]video_skip: mov es,dx xor di,di mov ah,0feh ;获取屏幕地址 int 10h mov cs:screen_segment,es ;保存屏幕缓冲区的地址 mov cs:screen_offset,di mov es,cs:screen_segment ;屏幕缓冲区驻留地址 [color=#FF0000];如果把此处改成b800也不能显示[/color] mov di,cs:screen_offset mov ax,code_seg mov ds,ax ;程序屏幕的地址 mov si,offset program_screen mov cx,15 ;要写的屏幕的大小 mov al,3h cldnext_char: movsb ;存储字符的ascii码 stosb ;存储所要显示的属性 loop next_char ;---------------------------------------[color=#FF0000] ;以下为测试是否进入彩色显示模式 ;经测试在保护模式/实模式下均可以正常显示[/color] 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 ;--------------------------------------- retwrite_screen endp
现在连彩色文本都搞不定,何时才能搞定彩色图形啊。漫漫长路,望高人指点下!
------解决方案--------------------------------------------------------
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