80X86 寄存器设计

皮贝贝 posted @ 2009年9月25日 00:08 in 虚拟机 with tags 寄存器 虚拟机 , 2220 阅读

 

/**
 * @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
    
    
};
  • 无匹配

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter