当前位置: 代码迷 >> 汇编语言 >> (初学者)BIOS程序设计写像素点失败,高手帮忙看看
  详细解决方案

(初学者)BIOS程序设计写像素点失败,高手帮忙看看

热度:1180   发布时间:2013-02-26 00:00:00.0
(菜鸟)BIOS程序设计写像素点失败,高手帮忙看看
(菜鸟)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吧.
  相关解决方案