0

これらが素朴な質問である場合は申し訳ありません-Cが実際に低レベルでどのように機能するかについて、私はほとんど理解していません。

だから私は実行のためにいくつかのmmapされたメモリに書き込むマシンコードを生成しています。マシン コードを生成するための 16 進数リテラルの使用について混乱しています。

アセンブリ命令 (AT&T 構文) を考えてみますcmove %edx, %ecx。これはマシンコード表現を持っています0x0F44CA

したがって、次のようなことをします:

char opcode[3] { 0x0F, 0x44, 0xCA };

「ボンネットの下」で正しいバイナリ文字列を表しますか? C の明らかに 16 進数リテラルは整数として格納されるため、そうではないのではないかと思います。私の懸念は、整数は 32 ビットであるため、格納される実際の値は

0x0000000F 0x00000044 0x000000CA

これは、私が必要としているものとはまったく異なるものです。

私が持っているもう1つの懸念は、配列に与える型が実際に格納されている値に影響するかということです. そうでしょう

uint8_t opcode[3] { 0x0F, 0x44, 0xCA };

また

int opcode[3] { 0x0F, 0x44, 0xCA };

とは異なる

char opcode[3] { 0x0F, 0x44, 0xCA };

フードの下?

4

2 に答える 2

1

実際の問題はわかりませんでしたが、これらの 2 つのポイントは、マシン コードをよりよく理解するのに役立つと思います。

  1. 使用するobjdumpと、 何が起こっているのかを理解するためmachine codeに集まります。assembly code

    objdump -d prog.o
    
  2. この記事を読むhttp://csapp.cs.cmu.edu/public/ch3-preview.pdf

これが少しでもお役に立てば幸いです。

于 2013-08-20T11:36:52.893 に答える
1

uint8_t opcode[3] = { 0x0F, 0x44, 0xCA };

値は、指定した順序で 8 ビット値の「バイト」として格納されます。

と同じです

unsigned char opcode[3] = { 0x0F, 0x44, 0xCA };

ただし、「int」タイプの使用は、システムのエンディアンに応じて、0000000F00000044000000CA または 0F00000044000000CA000000 と言ったとおりです。

于 2013-08-20T12:59:06.697 に答える