C:我如何模拟8086寄存器?

时间:2012-01-20 08:02:21

标签: c simulator cpu-registers x86-16

Ohai, 我目前正在尝试实现8086 ASM调试器以用于学习目的。到目前为止,我尝试使用char数组模拟8位和16位寄存器,但这种方法在使用AX,AL和AH时让我疯狂。

#define setAL() { int i; for (i = 0; i < 8; i++) AL[i] = AX[i]; }
char AX[16]   = {0, 1, 1, 1, 1 ,1 ,1, 0, 0, 0, 0, 0, 0, 0, 0, 0};
char AL[8]    = {0, 0, 0, 0, 0, 0, 0, 0};

有没有人有任何好主意(或类似'最佳实践')如何模拟这些寄存器?

4 个答案:

答案 0 :(得分:7)

我不认为有这样做的“最佳实践”方法,但你可以采取的一种方法可能会让你更少疯狂,就是使用一个联合覆盖8位和16位部分:

struct RegByte { 
   unsigned char low;
   unsigned char high;
};

struct RegWord {
   unsigned short value;
};

union Reg {
   struct RegWord word;
   struct RegByte bytes;
};

或者,如果您明确地仅针对8086,则可以有一个包含所有16位寄存器的结构,另一个包含所有字节部分。 e.g。

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

struct RegWord {
   unsigned short ax, bx, cx, dx;
   /* nothing stopping you from continuing with si, di, etc even though
    * they don't have addressable high and low bytes */
};

union Reg {
   struct RegWord word;
   struct RegByte byte;
};

答案 1 :(得分:3)

我将结构抽象出来并使用存取函数。

struct registry_file_t;
uint16_t get_al(registry_file_t * r);
void set_al(registry_file_t * r, uint16_t value);

启用内联后,这种方法的性能不会低于使用联合。

答案 2 :(得分:1)

为什么不这样使用structureunion

union AX_R {
    AX_R() {
        AX = 0;
    }
    unsigned __int16 AX;
    struct {
        unsigned __int8 AL;
        unsigned __int8 AH;
    } _AX_R;
};

答案 3 :(得分:1)

如果它可能对某人有用,我会把我在这里写的那个。

null