UNION REGS

来源:互联网 发布:linux 挂载windows硬盘 编辑:程序博客网 时间:2024/06/18 06:20

REGS 是声明(描述) Intel 80x86 CPU 16位通用寄存器的一个内部结构(还包括标志位寄存器,标志位寄存器一般用作设置或获得错误)。

一般的用途是:
向中断接口提供一个参数寄存器组。
该结构会在int86()函数、int86x() 函数、intdos() 函数及intdosx()函数中被使用到,这四个函数已在头文件 dos.h 中被声明,详细使用方法请网友自行参阅相关文档或书籍。

如果学过汇编的网友应该很容易地看懂,若没有学过汇编需要先去参考一下汇编相关入门书籍。
简而言之,80x86 16位通用寄存器包括:
AX,BX,CX,DX,SI,DI,SP,BP(最后的 SP 和 BP)在C中没有被声明。

此外,AX,BX,CX,DX 分别分为高位字节(High)与低位字节(Low),
分别是(左边为高位字节,右边为低位字节):
AX{AH,AL}
BX{BH,BL}
CX{CH,CL}
DX{DH,DL}

无论是 16 位的寄存器(AX,BX ……),还是 16 位寄存器的高低位字节(8位宽)(AH,AL,BH,BL……),
并没有明确地说明各个寄存器的作用,而常规地,尤其在 CPU 中断指令等地方,那些寄存器有各自特定的用途。

在C语言中的 REGS 结构如下:该联合体在dos.h 中定义

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

明显地,REGS 是由两个另外的结构封装而成,WORDREGS 结构及 BYTEREGS 结构。
而 WORDREGS 如下:

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

unsigned int 一般在16位字长CPU下的编译器被定义尺寸是16位(2字节)的。
ax,bx,cx,dx,si,di 在前面已有说明,而 cflag 与 flags 用于标志寄存器。

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

分别是前面说的各寄存器的高位字节与低位字节的描述,以 unsigned char 类型来声明是因为,
高位字节与低位字节都是8位宽。

声明一个 REGS 结构类型的变量后,如 REGS regs;
可以使用用 WORDREGS 结构的 x 来访问或设置16位寄存器,如 regs.x.dx = FP_OFF(FarVar);
使用 BYTEREGS 结构的 h 来访问16位寄存器的高位或低位字节,如 regs.h.ah = 9;

转自:http://hi.baidu.com/cg_nirvana/item/eb27df95b79174b883d29555

原创粉丝点击