2012-01-20 8 views
4

Ohai、 私は現在、学習目的で8086 ASMデバッガを実装しようとしています。今までは、char配列を使って8ビットと16ビットのレジスタをシミュレートしようとしましたが、AX、AL、AHで作業する場合、このアプローチはナットとなります。C:8086レジスタをシミュレートするにはどうすればよいですか?

#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}; 

は、誰もがこれらのレジスタをシミュレートする方法を任意の良いアイデア(または「ベストプラクティス」のようなもの)を持っていますか?

答えて

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ビットレジスタを含む1つの構造と、すべてのバイト部分を含む構造を持つことができます。例えば

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; 
}; 
+0

これは移植可能ですか? (endianness、sizeof(short)、...) – asaelr

+1

いいえ、それはそれらの点で移植性がありません。短いことが16ビットになるという保証はありませんが、それは意図を越えています。移植性を探しているなら、作者はおそらくPaul Hseihの[this pstdint.h](http://www.azillionmonkeys.com/qed/pstdint.h)のような移植可能な整数の定義のセットを探す必要があります。同様に、エンディアンが異なるアーキテクチャー間の移植性が懸念される場合は、バイトフィールドの順序を切り替える必要があります。 –

1

なぜこのようstructureunionを使用していない:私は構造離れて抽象いただきたい

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

とアクセサ関数を使用します。

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

インライン展開を有効にすると、このアプローチは、共用体を使用するよりパフォーマンスが低下しません。

1

もし誰かにとって役に立ちそうな場合は、私がここに書いたものを入れます。

typedef struct cpu_8086_s cpu_t; 

struct cpu_8086_s 
{ 
    struct 
    { 
     union 
     { 
      uint16_t ax; 
      struct 
      { 
       uint8_t al; 
       uint8_t ah; 
      }; 
     }; 
     union 
     { 
      uint16_t cx; 
      struct 
      { 
       uint8_t cl; 
       uint8_t ch; 
      }; 
     }; 
     union 
     { 
      uint16_t dx; 
      struct 
      { 
       uint8_t dl; 
       uint8_t dh; 
      }; 
     }; 
     union 
     { 
      uint16_t bx; 
      struct 
      { 
       uint8_t bl; 
       uint8_t bh; 
      }; 
     }; 
     uint16_t sp; 
     uint16_t bp; 
     uint16_t si; 
     uint16_t di; 
    }; 
    struct 
    { 
     uint16_t es; 
     uint16_t cs; 
     uint16_t ss; 
     uint16_t ds; 
    }; 
    uint16_t ip; 
    union 
    { 
     uint16_t flags; 
     struct 
     { 
      uint8_t c: 1; 
      uint8_t : 1; 
      uint8_t p: 1; 
      uint8_t : 1; 
      uint8_t a: 1; 
      uint8_t : 1; 
      uint8_t z: 1; 
      uint8_t s: 1; 
      uint8_t t: 1; 
      uint8_t i: 1; 
      uint8_t d: 1; 
      uint8_t o: 1; 
     }; 
    }; 
}; 
関連する問題