Как сказано в ответе Matteo Italia, gcc позволяет вам определить 64-битный тип перечисления, указав 64-битное значение для одного из членов. Например:
enum some_enum {
/* ... */
max = 0x7fffffffffffffff
};
Что касается использования 'mov'
, 'cmp'
и т. Д., То нет необходимой корреляции между представлением строкового литерала, например "mov"
, и представлением многосимвольной символьной константы, такой как 'mov'
. .
Последнее допустимо (и поддерживается gcc), но значение определяется реализацией. Стандарт гласит, что типом всегда является int
, и gcc, похоже, не имеет расширения, позволяющего вам это переопределить. Так что если int
равен 4 байта, тогда 'sysenter'
, если он вообще принят, не обязательно будет иметь значение, которое вы ищете. Кажется, gcc игнорирует все байты младшего разряда такой константы. Кажется, что значение константы одинаково для систем с прямым и обратным порядком байтов - это означает, что не будет постоянно соответствовать представлению подобного строкового литерала.
Например, эта программа:
#include <stdio.h>
int main(void) {
const char *s1 = "abcd";
const char *s2 = "abcdefgh";
printf("'abcd' = 0x%x\n", (unsigned)'abcd');
printf("'abcdefgh' = 0x%x\n", (unsigned)'abcdefgh');
printf("*(unsigned*)s1 = 0x%x\n", *(unsigned*)s1);
printf("*(unsigned*)s2 = 0x%x\n", *(unsigned*)s2);
return 0;
}
производит этот вывод при компиляции с gcc в системе с прямым порядком байтов (x86):
'abcd' = 0x61626364
'abcdefgh' = 0x65666768
*(unsigned*)s1 = 0x64636261
*(unsigned*)s2 = 0x64636261
и этот вывод в системе с прямым порядком байтов (SPARC):
'abcd' = 0x61626364
'abcdefgh' = 0x65666768
*(unsigned*)s1 = 0x61626364
*(unsigned*)s2 = 0x61626364
Так что, боюсь, ваша идея сопоставления символьных констант, таких как 'mov'
, со строками, такими как "mov"
, не сработает. (Возможно, вы могли бы нормализовать строковые представления в порядке с прямым порядком байтов, но я бы не стал использовать этот подход сам.)
Проблема, которую вы пытаетесь решить, - это быстрое сопоставление строк, таких как "mov"
, с конкретными целочисленными значениями, которые представляют инструкции процессора. Вы правы, что длинная последовательность вызовов strcmp()
будет неэффективной (вы действительно измерили ее и обнаружили, что скорость недопустима?), Но есть более эффективные способы. Хэш-таблица в некотором роде, вероятно, лучшая. Существуют инструменты для генерации совершенных хеш-функций, так что относительно дешевое вычисление значения строки дает уникальное целочисленное значение.
Вы не сможете писать определения значений перечисления так же удобно, как только вы получите правильную хеш-функцию, вы можете написать программу для генерации исходного кода C для типа enum .
Это предполагает, что перечисление - лучший подход здесь; это не может быть. Если бы я делал это, центральная структура данных была бы коллекцией структур, каждая из которых содержит строковое имя оператора и любую другую информацию, связанную с ним. Хеш-функция отображает строки типа "mov"
на индексы в этой коллекции. (Я намеренно размышляю о том, какую «коллекцию» использовать; с правильной хеш-функцией это может быть простой массив.) С таким решением я не думаю, что нужен 64-битный тип enum .