家电维修班,手机维修班,电脑维修班,电工班,焊工班,液晶电视维修班,电动工具维修班、电动车摩托车维修班、网络营销培训、网站设计培训、淘宝培训---全国招生 家电维修班,手机维修班,电脑维修班,电工班,焊工班,液晶电视维修班,电动工具维修班、电动车摩托车维修班、网络营销培训、网站设计培训、淘宝培训---全国招生
您的位置:网站首页 > 电器维修资料网 > 正文 >

基于表格驱动的程序设计思想

★★★★★【文章导读】:基于表格驱动的程序设计思想具体内容是:软件的可移植性是指软件产品从一个硬件/软件环境转移到另一个硬件/软件环境的难易与繁简程度。它从软件对新环境的适应性这一方面,反映了软件的质量。为了提高软件的可移植性,应尽量使软件与具体的设备无关,即提高…

来源: 日期:2013-12-8 11:33:15 人气:标签:

基于表格驱动的程序设计思想

    软件的可移植性是指软件产品从一个硬件/软件环境转移到另一个硬件/软件环境的难易与繁简程度。它从软件对新环境的适应性这一方面,反映了软件的质量。为了提高软件的可移植性,应尽量使软件与具体的设备无关,即提高软件的设备独立性。对于256色图形界面而言,就是要使程序不依赖于某种特定的显示器。例如,程序员没有任何理由假定用户使用的是TVGA。为此,程序员必须提供显示卡的常规检测例程,并能根据检测的结果决定图形算法的具体实现。

    提高软件设备独立性的方法有很多,表格驱动就是其中一种。所谓表格,就是根据需要设计的数据结构。表格中的数据由检测例程填写。表格中包含哪些栏目,应在对各制造商提供的SuperVGA产品足够了解的基础上取舍,栏目应体现各产品之间的差异。

    一、SuperVGA编程综述

    SuperVGA产品在体系结构上和标准的IBM VGA有所不同。但编程思想基本上是一样的,这些编程方法已有许多文章介绍,这里不再重复。

    不同分辨率之间的区别,体现在编程上就是同一屏幕坐标映射到显存的地址不同,但映射机理却是一样的。具体地说,坐标(x,y)对应显存的偏移地址(相对于A000)为Addr=-vga-width*y+x

    2.分页机制不同。SuperVGA使用256K、512K或1M

    的显示存储器结构。为了使处理器可通过一个64K主窗口来存取这样大的显示存储器,SuperVGA有一个存储器分页机制,使得只将显示存储器的一部分映射到处理器的地址空间。值得注意的是,不同的VGA产品,其页的大小不同,页起始地址的粒度也是可变的。具体的页选择算法请查阅制造商提供的资料。

    不同的显示模式,显示一屏图像所需的页数是不同的。

    除了可移植性外,效率也是一个不可忽视的因素。图形系统的核心部分应使用汇编语言编程。这不仅是因为汇编语言的效率高,而且还因为汇编语言子程序的可再用性和可协用性也很好。核心部分应十分重视下面几点:(1)减少不必要的页边界检查次数;(2)只有在必要时才进行页选择;(3)选择高效的机器指令。现举例说明。程序1是图像显示系统中常用的函数,其功能是将解包后的图像数据送到显存。为便于阅读同时给出了C语言调用原型。程序在传送每一行数据时,提前预测是否会遇到页边界,如果没有,直接传送;如果有,则将数据分成两部分,分别传送,中间插入页选择。所有的传送均用字操作代替字节操作。页边界检查只有一次,分页操作只有在必要时才发生,图像的显示用最高效的指令REP MOVSW。

    程度1:

    ;原型:void LineDump(int x,int y, int num, char far*ptr)

    ;参数:

    ; x,y-屏幕坐标

    ; num-本行的像素个数

    ; ptr-指向像素数据的远指针

    LineDump proc far

    push bp

    mov bp,sp

    sub sp,2;WORD Reserved for LOCal var.

    push ds

    push es

    push si

    push di

    reserved equ [bp-2];Local var.save seg(DGROUP)

    x equ [bp+6];Large Model

    y equ [bp+8]

    num equ [bp+10]

    offs equ [bp+12]

    pseg equ [bp+14]

    mov reserved,ds

    mov ds,pseg

    mov si,offs ;DS:SI图像数据所在源地址

    mov ax,0a000h;显存段址

    mov es,ax ;ES:DI显存目的地址

    mov ax,y

    push ds

    mov ds,reserved

    mul word ptr DGROUP:-vga-width

    pop ds

    add ax,x

    adc dx,0

    mov di,ax ;DI=-vga-width*y+x

    mov ah,dl ;进位部分(DL)=页号

    call dword ptr cs:-PageSelect

    mov cx, num ;本行要传送字节数

    mov bx, cx

    add bx,di ;检测传送是否在一个页内

    jnc Dump-In-One-Page

    sub cx,bx ;CX=本页字节数,BX=下页字节数

    shr cx,1 ;CX/2=字数

    rep movsw ;本页内的传送

    adc cx,0

    rep movsb ;处理可能的奇数字节数

    inc ah ;调整页号

    call dword ptr cs:-PageSelect

    mov cx,bx ;新页内要写的字节数

    jcxz Dump-Done

    Dump-In-One-Page:

    shr cx,1 ;CX/2=字数

    rep movsw ;图像传送

    adc cx,0

    rep movsb ;处理可能的奇数字节数

    Dump-Done:

    pop di

    pop si

    pop es

    pop ds

    mov sp,bp

    pop bp

    ret

    LineDump endp

    二、表格驱动的基本思想

    根据上面的分析,用以驱动显示系统的表格,至少应当包含下列项目:

    (1)实际显示模式:vga-mode

    (2)水平分辨率:vga-width

    (3)垂直分辨率:vga-depth

    (4)页选择例程的入口地址:PageSelect

    (5)当前显示方式所使用的最大页号:vga-pages

    这个表格由图形初始化例程来填写。图形初始化例程接收的显示模式是统一的模式号,这样可以撇开具体的设备,如InitVGA(TVGA800×600)。该例程调用显示设备检测程序DetectVGA来判断显示器的类型,从而填写表格中的各栏目,并初始化图形系统为所需的图形方式。所有图形算法都要查此表。

    除了用上述方法来实现兼容外,视频电子学标准协会(VESA)为我们提供了另一种方法。

    VESA

    提供了一组附加的BIOS功能,这组功能以标准的方式访问SuperVGA扩充的模式。VESA的附加功能都是通过BIOS中断10H的4FH功能来实现的。VESA的子功能01能返回非常有用的SuperVGA模式信息,包括分页例程的地址。

    因此,程序员可以按照VESA的标准来编写图形系统,这样的程序可以在所有支持VESA的显示器上运行。由于VESA包括了世界上的主要VGA供应商,写出来的程序可移植性是很好的。但是,其效率却可能是最低的。所以最好采用一种折衷的办法,对于熟悉的产品,可以不用VESA的功能,对于不熟悉(资料不全)或检测不出来的显示器尝试用VESA提供的手段来编程,当然要检测显示设备是否支持VESA。

    有时出于某种考虑,不希望支持所有显示设备的代码集中在一个程序中,可以为每个显示设备分别提供驱动模块,主程序根据检测的结果选择一个合适的模块加载。Borland的C++就是这样,它有一套BGI驱动程序,各驱动程序提供统一的图形函数接口。笔者在实际工作中,为每一种显示设备编写了一个256色的BGI格式的驱动程序,这样,在编写图形系统时,再也没有必要考虑用户的实际显示设备了。

    三、范 例

    本文附有两个图形显示的例子。ShowGif能显示16/256色GIF格式图像,能以任何256色模式启动,支持多种显示器。图像可以漫游,并可随时通过按键切换显示方式。Main则是一个BGI驱动的鼠标/键盘控制的256色汉字图形菜单。它自己会挑选一个合适的BGI,也可以从命令行指定一个BGI(比如指定VESA256给TVGA显示器)。

    限于篇幅,这里仅给出有关的数据结构和部分函数的说明(程序2)。然后给出一个初始化显

    示系统的C语言片断(程序3)。

    程序2(TVGA256.H):

    /* 统一的模式集 */

    enum TVGA-MODE

    TVGA320x200=0,

    TVGA640x400=1,

    TVGA640x480=2,

    TVGA800x600=3,

    TVGA1024x768=4,

    ;

    void TVGA256-driver(void);

    void PVGA256-driver(void);

    void AVGA256-driver(void);

    ...

    void VESA256-driver(void);

    extern int far-Cdecl TVGA256-driver-far[];

    extern int far-Cdecl PVGA256-driver-far[];

    extern int far-Cdecl AVGA256-driver-far[];

    ...

    extern int far-Cdecl VESA256-driver-far[];

    /* 支持的VGA集合 */

    enum VGAs{

    UnKnownVGA,

    TridentVGA,

    ParadiseVGA,

    AheadVGA,

    ...

    VesaVGA

    };

    /* 对应的BGI驱动程序名 */

    unsigned char *Drivers[]={

    "TVGA256",

    "TVGA256",

    "AVGA256",

    ...

    "VESA256",

    };

    extern int DetectVGA(void);

    /* 功 能:检测显示卡的型号

    返回值:0-Unknowm1-Trident VGA2-Paradise VGA

    ...

    x-不能检测出的VGA,但支持VESA

    返回值同时写入全局变量vga-type */

    extern int VesaFound(void);

    /* 功 能:检测VESA BIOS的存在性

    返 回:0-不支持VESA;

    其它-VESA版本号(0x0102即1.02版);

    返回值同时写入全程变量vesa-found. */

    extern void InitVesa(void);

    /* 功 能:初始化VESA.根据-vga-mode模式号换算成VESA的标准模式号填写页粒度(WinGranularity),页大小(WinSize),

    和分页例程的入口地址(WinFuncPtr)

    VESA的标准模式解释如下:

    100h-640x400 256

    101h-640x480 256

    102h-800x600 16

    103h-800x600 256

    104h-1024x768 16

    105h-1024x768 256 etc.

    InitVesa供给InitVGA调用 */

    extern void InitVGA(int mode);

    /* 功 能:初始化显示系统(自动调用DetectVGA检测显示卡)

    参 数:mode=TVGA320x200(0)

    TVGA640x400(1)

    TVGA640x480(2)

    TVGA800x600(3)

    TVGA1024x768(4)

    返 回:InitVGA没有显式的返回值,但它初始化下列全程变量:

    vga-mode,vga-width,vga-depth,vga-pages,PageSelect

    必要时自动调用InitVesa

    */

    extern int vga-type;

    extern int vga-mode;

    extern int vga-width;

    extern int vga-depth;

    extern int vga-pages;

    extern int vga-pages;

    extern char page-number;

    extern int vesa-found;

    ...

    程序3(初始化显示系统的程序片断):

    ...

    int GraphDriver, GraphMode;

    unsigned char *bgiDriver="PVGA256";

    bgiDriver=Drivers[DetectVGA()];

    GraphDriver=installuserdriver(bgiDriver,NULL);

    GraphMode=TVGA800x600;

    initgraph(&GraphDriver, &GraphMode," ");...

    参考文献

    1 来文占等编译.Super VGA高级编程指南.北京:北京科海培训中心,1991.5.

    2 张一波编译.Super VGA与VESA编程指南.北京:海洋出版社,1992


【看看这篇文章在百度的收录情况】

相关文章

联系方式

  • 0731-85579057 , 0731-85569651
  • 点击这里给我发消息点击这里给我发消息点击这里给我发消息
网站栏目导航: 培训课程 手机硬件 手机软件 综合维修 学校资讯 考证指南 就业导航 招生指南 教学管理 入学须知 学校图片 教学大纲 师资力量 学生感言 学校概况 教学实景 手机维修培训资讯 电脑维修培训 维修间故事 手机维修培训 液晶电视维修培训 家电维修资料网 电器维修资料网 招生地区 刷机教程 家电维修 手机技巧 老版网站 招生平台网络工程
友情链接: 监控安装培训 电动工具维修 家电维修学校 电工培训学校 液晶电视维修 焊工培训学校 电工焊工学校 电脑维修学校 家电维修培训 电脑维修培训 家装电工培训网络安装维护 主板维修 液晶显示器 笔记本电脑维修 电脑组装维护 电脑硬件维修 电脑维修 电工考证 电工证 装修电工 水电工 维修电工 电工 焊接技术 电焊工 焊工 电动设备维修 电动工具维修 制冷维修 空调维修 冰箱维修  更多>>
阳光-手机维修教育品牌学校
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
电工培训学校 电动车维修学校 摩托车维修学校 摩托车维修培训 手机维修培训 家电维修培训 电脑维修培训 电动工具维修培训 液晶电视维修培训 安防监控培训 空调维修培训 网络营销培训 网站设计培训 淘宝网店培训 电器维修培训 家电维修学校 电工培训 焊工培训 电工学校 电工培训学校 电动车维修学校 摩托车维修学校 摩托车维修培训 手机维修培训 家电维修培训 电脑维修培训 电动工具维修培训 液晶电视维修培训 安防监控培训 空调维修培训 网络营销培训 网站设计培训 淘宝网店培训 电器维修培训 家电维修学校 电工培训 焊工培训 电工学校 电工培训学校 电动车维修学校 摩托车维修学校 摩托车维修培训 手机维修培训 家电维修培训 电脑维修培训 电动工具维修培训 液晶电视维修培训 安防监控培训 空调维修培训 网络营销培训 网站设计培训 淘宝网店培训 电器维修培训 家电维修学校 电工培训 焊工培训 电工学校 电工培训学校 电动车维修学校 摩托车维修学校 摩托车维修培训 手机维修培训 家电维修培训 电脑维修培训 电动工具维修培训 液晶电视维修培训 安防监控培训 空调维修培训 网络营销培训 网站设计培训 淘宝网店培训 电器维修培训 家电维修学校 电工培训 焊工培训 电工学校
中山市,固原市,银川市,玉树,海东,陇南市,酒泉市,张掖市,天水市,金昌市,兰州市,榆林市,延安市,渭南市,铜川市,阿里,山南,拉萨市,怒江,文山州,楚雄州,普洱市,昭通市,玉溪市,昆明市,毕节,铜仁,遵义市,贵阳市,甘孜州,资阳市,达州市,宜宾市,南充市,遂宁市,绵阳市,泸州市,自贡市,三亚市,崇左市,河池市,玉林市,钦州市,梧州市,柳州市,梅州市,肇庆市,湛江市,佛山市,珠海市,韶关市,湘西州,怀化市,郴州市,张家界市,邵阳市,株洲市,仙桃市,随州市,荆州市,荆门市,襄樊市,黄石市,驻马店市,信阳市,南阳市,漯河市,中卫市,石嘴山市,海西,海南藏州,黄南州,海北,甘南,庆阳市,平凉市,武威市,白银市,嘉峪关市,安康市,汉中市,咸阳市,宝鸡市,林芝,日喀则,昌都,迪庆,德宏,大理,西双版纳,红河州,临沧市,丽江市,保山市,曲靖市,黔东州,黔西州,安顺市,六盘水市,凉山州,阿坝州,雅安市,广安市,眉山市,内江市,广元市,德阳市,攀枝花市,成都市,海口市,来宾市,百色市,贵港市,北海市,桂林市,南宁市,云浮市,揭阳市,潮州市,清远市,阳江市,汕尾市,惠州市,茂名市,江门市,汕头市,深圳市,广州市,娄底市,永州市,益阳市,岳阳市,湘潭市,长沙市,恩施州,黄冈市,孝感市,鄂州市,十堰市,武汉市,周口市,商丘市,三门峡市,许昌市,焦作市,安阳市,鹤壁市,平顶山市,开封市,郑州市,聊城市,滨州市,德州市,莱芜市,日照市,泰安市,烟台市,潍坊市,东营市,淄博市,上饶市,济南市,抚州市,宜春市,赣州市,新余市,九江市,景德镇市,宁德市,南平市,泉州市,莆田市,厦门市,宣城市,亳州市,六安市,宿州市,黄山市,滁州市,安庆市,淮北市,马鞍山市,蚌埠市,芜湖市,合肥市,丽水市,舟山市,衢州市,金华市,湖州市,嘉兴市,宁波市,宿迁市,镇江市,盐城市,连云港市,苏州市,徐州市,南京市,绥化市,牡丹江市,佳木斯市,大庆市,鹤岗市,哈尔滨市,白城市,白山市,辽源市,吉林市,葫芦岛市,铁岭市,盘锦市,阜新市,锦州市,本溪市,鞍山市,沈阳市,锡林郭勒盟,通辽市,乌海市,吕梁市,忻州市,晋中市,晋城市,阳泉市,太原市,廊坊市,承德市,保定市,邯郸市,唐山市,宁夏,甘肃省,西藏,贵州省,重庆市,广西,湖南省,河南省,江西省,安徽省,江苏省,黑龙江省,辽宁省,山西省,天津市,四平市,内蒙古,吴忠市,果洛,西宁市,定西市,商洛市,西安市,那曲,黔南州,巴中市,乐山市,贺州市,防城港市,东莞市,河源市,常德市,衡阳市,咸宁市,宜昌市,濮阳市,新乡市,洛阳市,菏泽市,临沂市,威海市,济宁市,枣庄市,青岛市,吉安市,鹰潭市,萍乡市,南昌市,龙岩市,漳州市,三明市,福州市,池州市,巢湖市,阜阳市,铜陵市,淮南市,台州市,绍兴市,温州市,杭州市,泰州市,扬州市,淮安市,南通市,常州市,无锡市,大兴安岭,黑河市,七台河市,伊春市,双鸭山市,鸡西市,齐齐哈尔市,延边,松原市,通化市,长春市,朝阳市,辽阳市,营口市,丹东市,抚顺市,大连市,阿拉善盟,兴安盟,乌兰察布市,巴彦淖尔市,呼伦贝尔市,鄂尔多斯市,赤峰市,包头市,呼和浩特市,临汾市,运城市,朔州市,长治市,大同市,衡水市,沧州市,张家口市,邢台市,秦皇岛市,石家庄市,青海省,陕西省,云南省,四川省,海南省,广东省,湖北省,山东省,福建省,浙江省,上海市,吉林省,河北省,北京市