/** * @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 };