Извините, если это наивные вопросы - я очень плохо понимаю, как C действительно работает на низком уровне.
Итак, я генерирую машинный код для записи в некоторую память mmap для выполнения. Меня смущает использование шестнадцатеричных литералов для генерации машинного кода.
Рассмотрим инструкцию по сборке (синтаксис AT&T): cmove %edx, %ecx
. Это представление машинного кода 0x0F44CA
.
Итак, сделал бы что-то вроде:
char opcode[3] { 0x0F, 0x44, 0xCA };
представлять правильную двоичную строку в разделе, когда «под капотом»? Я подозреваю, что это не так, поскольку шестнадцатеричные литералы в C, по-видимому, хранятся как целые числа. Меня беспокоит то, что, поскольку целые числа являются 32-битными, фактические значения сохраняются
0x0000000F 0x00000044 0x000000CA
Что-то совершенно отличное от того, что мне нужно.
Еще одна проблема, которую я беспокою, заключается в том, влияет ли тип, который я даю массиву, на фактически сохраняемое значение? Так бы
uint8_t opcode[3] { 0x0F, 0x44, 0xCA };
or
int opcode[3] { 0x0F, 0x44, 0xCA };
отличаться от
char opcode[3] { 0x0F, 0x44, 0xCA };
под капотом?
int
иunsigned int
скорее всего 32-разрядные. Хорошо, чтоchar opcode[3]
не является массивомint
. Но ваша вторая проблема верна, и я предлагаю провести дополнительные исследования (начните с этого). - person WhozCraig   schedule 20.08.2013=
между]
и{
. Думайте об инициализациях как о присваиваниях. - person unwind   schedule 20.08.2013