(菜鸟)BIOS程序设计写像素点失败,高手帮忙看看
BIOS程序设计写像素点失败,就是调用INT 10H视频服务 的 0CH功能来写像素 调用就提示:
调用BIOS 执行第三次 int 10h 0x00000009 指令引用的 0x720789a3 内存不能为 写(written)
0x720789a3 是DLL的地址吧
源码: (注释都写的好了)
.model small
.stack 200h
.386
;有些视频图形模式未用,该例子只使用 Mode_6A
Mode_06 = 6 ; 640 X 200, 2 colors
Mode_0D = 0Dh ; 320 X 200, 16 colors
Mode_0E = 0Eh ; 640 X 200, 16 colors
Mode_0F = 0Fh ; 640 X 350, 2 colors
Mode_10 = 10h ; 640 X 350, 16 colors
Mode_11 = 11h ; 640 X 480, 2 colors
Mode_12 = 12h ; 640 X 480, 16 colors
Mode_13 = 13h ; 320 X 200, 256 colors
Mode_6A = 6Ah ; 800 X 600, 16 colors
.data
saveMode BYTE ? ;保存原来视频模式的变量
currentX WORD 100 ;X横坐标
currentY WORD 100 ;Y纵坐标
COLOR = 1001b ;颜色属性 高位4位为背景颜色未使用,只使用前景颜色(低4位) 1001b=浅蓝色
.code
main PROC
mov ax,@data ;取得段地址
mov ds,ax
mov ah,0Fh ;获得视频模式信息
int 10h ;调用BIOS
mov saveMode,al ;保存原来的视频模式
mov ah,0 ;设置视频模式
mov al,Mode_6A ;设置为800 * 600
int 10h ;调用BIOS
mov ah,0Ch ;写像素点
mov al,COLOR ;像素的颜色
mov bh,0 ;视频页=0,当前视频页(活跃)
mov cx,currentX ;写的位置X坐标(像素单位)
mov dx,currentY ;写的位置Y坐标(像素单位)
int 10h ;调用BIOS 执行第三次 int 10h 0x00000009 指令引用的 0x720789a3 内存不能为 写(written)
mov ah,0 ;等待用户按键
int 16h ;调用BIOS INT 16H为键盘处理中断
mov ah,0 ;恢复原来的视频模式
mov al,saveMode ;要恢复的视频模式
int 10h ;调用BIOS
.exit
main endp
end main
------解决方案--------------------------------------------------------
不行的话,你把:
saveMode BYTE ? ;保存原来视频模式的变量
currentX WORD 100 ;X横坐标
currentY WORD 100 ;Y纵坐标
改成:
saveMode DB ? ;保存原来视频模式的变量
currentX = 100 ;X横坐标
currentY = 100 ;Y纵坐标
------解决方案--------------------------------------------------------
最好是调用windows API.我用nasm编译出来的com程序在windows下就不能调用BIOS中断的视频服务.但是在虚拟机中能用.windows是工作在保护模式下的,原来的BIOS中断不能再用,而我们做出的16位程序在windows下是工作在虚拟实模式下的,这种模式下似乎不能使用图形模式.所以要用视频还是用API吧.