2

レジスタでの作業をシミュレートしたいので、Register クラスを次のように宣言します。

class Register{
    uint8_t reg_ax[2];
    Register(){
        reg_ax[0] = reg_ax[1] = 0;
    }
    uint16_t &ax(){ return (uint16_t &)reg_ax[0]; }
};

axこれで、次のように (16 ビット)の値を印刷および編集できます。

Register regs;
cout << regs.ax() << endl;
regs.ax() = 5;
cout << regs.ax() << endl;

それはうまくいきますが、印刷して編集したい場合、alおよびah下位部分と上位部分 (8 ビット) はaxどうすればよいですか?! 私はこれを試しましたが、うまくいきません!

uint8_t &al(){ return reg_ax[1]; }
uint8_t &ah(){ return reg_ax[0]; }

これを行うと、出力は表示されません。

cout << regs.al() << endl;

助けはありますか?

4

2 に答える 2

3

unsigned charおそらく問題は、 をとして出力しようとしているunsigned charためにcout << regs.ah();、文字 0 などを出力することでしょうか?

これは私のために働く:

#include <iostream>
#include <cstdint>

using namespace std;

class Register{
    uint8_t reg_ax[2];
public:
    Register(){
        reg_ax[0] = reg_ax[1] = 0;
    }
    uint16_t &ax(){ return (uint16_t &)reg_ax[0]; }
    uint8_t &al(){ return reg_ax[1]; }
    uint8_t &ah(){ return reg_ax[0]; }
};


int main()
{
    Register regs;
    regs.ax() = 500;
    cout << regs.ax() << endl;
    cout << (int)regs.ah() << endl;
    cout << (int)regs.al() << endl;
    return 0;
}

あなたがやるべきだったように、私は完全な例を投稿しています。その後、あなたが持っているインクルードを見ることができ、私が推測しなければならなかったものはすべて、あなたのコードと比較して正しいです.

于 2013-03-09T19:40:16.527 に答える
1

低/高バイトまたは16ビットレジスタを実装するために配列を使用することは最善の考えではありません。私がコメントで書いたように、ユニオンについて学びましょう。:変数定義のコンテキストでは、メモリ内のデータアライメント。

これにより、便利なレジスタアクセス構造体/クラスを実装するためのホットなアイデアが得られるはずです 。WindowsC / C ++でニブル(4ビット変数)を使用する

また、プラットフォームに類似したもののattribute __((__ packed))を使用することを忘れないでください。

編集: 私はこれでポイントを失うかもしれませんが、それはあなたにとって役立つかもしれません:-)。ビット単位、ニブル単位など、任意の方法でレジスタ(メモリマップ)にアクセスするためのツールを実装したら、を使用するアイデアが得られる可能性がありますstd::bitset。コードはここにあります:https ://code.google.com/p/jeeamtee/wiki/Main

于 2013-03-09T20:02:03.123 に答える