/**
* @file register.h
* @author Guo Lihui <guolihui112@gmail.com>
* @date Thu Sep 24 09:44:33 2009
*
* @brief 寄存器的一些设计
*
*
* @note 参考文章:汇编-32位CPU所有的寄存器
* (http://blog.minidx.com/2007/12/10/233.html)
*
*
*/
#include <windows.h> // 类型
#define MACHINE_WORD_LEN_16 16
#define MACHINE_WORD_LEN_32 32
#define MACHINE_WORD_LEN_64 64
#define MACHINE_WORD_LEN MACHINE_WORD_LEN_32
/**
*
* 4个数据寄存器(EAX、EBX、ECX和EDX)
* 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)
* 6个段寄存器(ES、CS、SS、DS、FS和GS)
* 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)
*
*
*/
/**
* 数据寄存器 DATA_REGISTER
*
* @param XL 低8位名称
* @param XH 高8位名称
* @param XX 低16位名称
* @param EXX 32 位名称
*
*/
#define DATA_REGISTER( XL, XH, XX, EXX ) \
union \
{ \
union{ \
struct \
{ \
BYTE XL; \
BYTE XH; \
}; \
WORD XX; \
}; \
DWORD EXX; \
};
/**
* 变址寄存器 INDEX_REGISTER
*
* @param XI 低16位
* @param EXI 32位
*
*/
#define INDEX_REGISTER( XI, EXI ) \
union \
{ \
WORD XI; \
DWORD EXI; \
};
/**
* 指针寄存器 POINTER_REGISTER
*
* @param XP 低16位
* @param EXP 32位
*
*/
#define POINTER_REGISTER( XP, EXP ) \
union \
{ \
WORD XP; \
DWORD EXP; \
};
/**
* 段寄存器 SEGMENT_REGISTER
*
* @param XS 16位
*
*/
#define SEGMENT_REGISTER( XS ) \
WORD XS;
/**
* 指令指针寄存器 INSTRUCTION_POINTER_REGISTER
*
* @param XP 低16位
* @param EXP 32位
*
*/
#define INSTRUCTION_POINTER_REGISTER( XP, EXP ) \
union \
{ \
WORD XP; \
DWORD EXP; \
};
#define FLAG_REGISTER( XF ) \
BYTE XF : 1;
struct REGISTER_GROUP
{
// 数据寄存器
DATA_REGISTER( AL, AH, AX, EAX ); // 累加器(Accumulator)
DATA_REGISTER( BL, BH, BX, EBX ); // 基地址寄存器(Base Register)
DATA_REGISTER( CL, CH, CX, ECX ); // 计数寄存器(Count Register)
DATA_REGISTER( DL, DH, DX, EDX ); // 数据寄存器(Data Register)
// 变址寄存器
INDEX_REGISTER( SI, ESI );
INDEX_REGISTER( DI, EDI );
// 指针寄存器
POINTER_REGISTER( BP, EBP ); // 基指针(Base Pointer)寄存器
POINTER_REGISTER( SP, ESP ); // 堆栈指针(Stack Pointer)寄存器
// 段寄存器
SEGMENT_REGISTER( CS ); // 代码段寄存器(Code Segment Register),其值为代码段的段值;
SEGMENT_REGISTER( DS ); // 数据段寄存器(Data Segment Register),其值为数据段的段值;
SEGMENT_REGISTER( ES ); // 附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
SEGMENT_REGISTER( SS ); // 堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值;
SEGMENT_REGISTER( FS ); // 附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
SEGMENT_REGISTER( GS ); // 附加段寄存器(Extra Segment Register),其值为附加数据段的段值。
// 指令指针寄存器
INSTRUCTION_POINTER_REGISTER( IP, EIP );
// 标志寄存器
// ... 运算结果标志位
FLAG_REGISTER( CF ); // 进位标志(Carry Flag)
FLAG_REGISTER( PF ); // 奇偶标志(Parity Flag)
FLAG_REGISTER( AF ); // 辅助进位标志(Auxiliary Carry Flag)
FLAG_REGISTER( ZF ); // 零标志(Zero Flag)
FLAG_REGISTER( SF ); // 符号标志(Sign Flag)
FLAG_REGISTER( OF ); // 溢出标志(Overflow Flag)
// ... 状态控制标志位
FLAG_REGISTER( TF ); // 追踪标志
FLAG_REGISTER( IF ); // 中断允许标志
FLAG_REGISTER( DF ); // 方向标志
// ... 32 位标志寄存器增加的标志位
#if MACHINE_WORD_LEN != MACHINE_WORD_LEN_16
FLAG_REGISTER( IOPL ); // I/O 特权标志 IOPL(I/O Privilege Level)
FLAG_REGISTER( NT ); // 嵌套任务标志NT(Nested Task)
FLAG_REGISTER( RF ); // 重启任务标志(Restart Flag)
FLAG_REGISTER( VM ); // 虚拟8086方式标志(Virtual 8086 Mode)
#endif
};