手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

C语言的常用库函数使用方法分析及用途(2)

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
CPU寄存器(AX)的内容拷贝到输出指针指向的共用体中。在使用int86() 函数进行BIOS接口的系统调用时,有的中断调用设有若干选择项,这些选择项能够根据调用时AH寄存器中的值来进行访问。

  注:1.需先定义 union REGS 输入指针名,输出指针名;

  2.向寄存器传递入口信息

  输入指针名.x.寄存器名=要赋的值(入口信息);

  3.调用int86后得接受出口信息

  变量名=输出指针名.x.寄存器名

  4.REGS的定义(在dos.h中):

  struct WordREGS{unsigned int ax, bx, cx, dx, si, di, cflag, flags;}

  struct BYTEREGS{unsigned char al, ah, bl, bh, cl, ch, dl, dh;}

  union REGS{struct WordREGS x;struct BYTEREGS h;}

  头文档:dos.h

  int86x()执行中断函数 (通用8086软中断接口函数)

  头文档:dos.h

  原形:int int86x(int intno,union REGS *inregs,union REGS *outregs,struct SREGS * segregs)

  调用方式:int86x(中断号,&输入指针名,&输出指针名,&段寄存器指针名);

  注1:需先定义 union REGS 输入指针名,输出指针名;

  union REGS 示意图

  struct     struct

  WORDREGS    BYTEREGS

  ┌  ┌───────┬──────┐──┬──  ┐

  │  │       │   al   │ 1 byte   │

  │  │   ax   ├──────┤──┴─ 2 bytes

  │  │       │   ah   │       │

  │  ├───────┼──────┤─────  ┘

  │  │       │   bl   │

  │  │   bx   ├──────┤

  │  │       │   bh   │

  │  ├───────┼──────┤

  │  │       │   cl   │

  │  │   cx   ├──────┤

  │  │       │   ch   │

  │  ├───────┼──────┤

  │  │       │   dl   │

  │  │   dx   ├──────┤

  │  │       │   dh   │

  union regs├───────┼──────┤

  │  │       │      │

  │  │   si   │      │

  │  │       │      │

  │  ├───────┤      │

  │  │       │      │

  │  │   di   │      │

  │  │       │      │

  │  ├───────┤      │

  │  │       │      │

  │  │  cflag   │      │

  │  │       │      │

  │  ├───────┤      │

  │  │       │      │

  │  │  flags   │      │

  │  │       │      │

  └  └───────┴──────┘

  │   x 两个结构变量 h  │

  └──  共享同一存储域 ──┘

  其中字段flags对应于标志寄存器。字段cflag仅对应于进位标志位,函数在调用时不用该字段,只在返回时配置这个字段,因为许多BIOS服务都是通过进位标置为0还是1来表示成功还是失败。

  注2:需先定义 struct SREGS 段寄存器指针名;

  结构SREGS定义如下

  struct SREGS {unsigned int es,cs,ss,ds}

  函数只用了该结构中的段寄存器DS和ES。调用时根据他们的值配置DS和ES,同时把DS和ES原来的值保存在这个结构中,返回时再恢复DS和ES为原来的值,这就允许程式使用远指针或大数据编译模式。

  该函数置全局变量_doserrno等于寄存器AX中的值,其返回值也等于AX中的值。

  注3:向寄存器传递入口信息

  输入指针名.x.寄存器名=要赋的值(入口信息);

  注4:调用int86x后得接受出口信息

  变量名=输出指针名.x.寄存器名

  intdos()通用dos中断接口函数

  原形:int intdos(inregs,outregs)

  union REGS *inregs;//调用时的各寄存器的值

  union REGS *outregs;//返回寄存器的值

  功能:产生DOS软中断

  注意:假如需要功能号,则装入AH;假如需要子功能号,则装入AL。

  头文档:dos.hintdosx()通用dos中断接口函数

  原形:int intdosx(inregs,outregs,segregs)

  union REGS *inregs;调用时的各寄存器的值

  union REGS *outregs;返回寄存器的值

  struct SREGS *seregs;调用时的段寄存器的值(还配置返回时的值)

  功能:产生DOS软中断

  头文档:dos.h

  intr()执行8086软中断函数(改变软中断接口函数)

  原形:void intr(int intno,struct REGPACK *preg)

  调用方式:intr(中断号,&结构变量名)

  注1:结构REGPACK定义如下

  struct REGPACK

  {

  unsigned r_ax,r_bx,r_cx,r_dx;

  unsigned r_bp,r_si,r_di,r_ds,r_es,r_flag;}

  注2:使用时先定义一个结构变量

  struct REGPACK 结构变量名;

  注3:入口和出口用同一个结构变量来传递寄存器的值。

  结构变量名.r_ax=要赋的值;

  ......

  intr(中断号,&结构变量名);

  某变量=结构变量名.r_ax;

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!