2

一部のコードを ASM から C++ に変換しています。ASM は単純に次のようになります。

mov dword ptr miscStruct, eax

構造体は次のようになります。

struct miscStruct_s {
  uLong brandID     : 8,
  chunks            : 8,
  //etc
} miscStruct;

C++ で構造体を埋める簡単な 1 行 2 行の方法はありますか? これまでのところ、私は使用しています:

miscStruct.brandID = Info[0] & 0xff; //Info[0] has the same data as eax in the ASM sample.
miscStruct.chunks = ((Info[0] >> 8) & 0xff);

これで問題なく動作しますが、これらのビットフィールド構造体の 9 ~ 10 個を埋める必要があり、そのうちのいくつかには 30 個の奇数フィールドがあります。したがって、このようにすると、10 行のコードが 100 行以上になることになりますが、これは明らかにそれほど素晴らしいことではありません。

では、C++ で ASM を複製する簡単でクリーンな方法はありますか?

もちろん、「miscStruct = CPUInfo[0];」を試しました。しかし、C++ は残念ながらそれを好みません。:(

error C2679: binary '=' : no operator found which takes a right-hand operand of type 'int'

..そして、構造体を編集できません

4

2 に答える 2

1

memcpy (&miscStruct, &CPUInfo[0], sizeof (struct miscStruct_s));

助けるべきです。

または単に

int *temp = &miscStruct;
*temp = CPUInfo[0];

CPUInfoここでは、 のタイプが であると想定していint ます。配列tempのデータ型でポインターの型を調整する必要があります。CPUInfo構造体のメモリアドレスを配列の型に型キャストし、ポインターを使用してそこに値を代入するだけです。

于 2011-07-30T06:07:46.690 に答える
1

アセンブラ命令のリテラル翻訳は次のとおりです。

miscStruct=*(miscStruct_s *)&Info[0];

C++ は型安全な言語であるのに対し、アセンブラーはそうではないため、キャストが必要ですが、コピーのセマンティクスは同じです。

于 2011-07-30T06:10:24.357 に答える