Моя машина на базе AMD использует прямой или обратный порядок байтов?
-
06-07-2019 - |
Вопрос
Я прохожу курс компьютерных систем и пытаюсь установить, Конечно, если мой компьютер на базе AMD является машиной с прямым порядком байтов?Я считаю, что это потому, что он будет совместим с Intel.
В частности, мой процессор — AMD 64 Athlon x2.
Я понимаю, что это может иметь значение в программировании на C.Я пишу программы на C, и это повлияет на метод, который я использую.Я пытаюсь выяснить, получу ли я те же результаты, если запущу программу на компьютере с процессором Intel (при условии, что является машина с прямым порядком байтов).
Наконец, позвольте мне спросить следующее:Могут ли все без исключения машины работать под управлением Windows (XP, Vista, 2000, Server 2003 и т. д.) и, скажем, Рабочий стол Ubuntu Linux быть с прямым порядком байтов?
Спасибо,
Откровенный
Решение
Все машины x86 и x86-64 (которые являются просто расширением x86) имеют младший порядок.
Вы можете подтвердить это примерно так:
#include <stdio.h>
int main() {
int a = 0x12345678;
unsigned char *c = (unsigned char*)(&a);
if (*c == 0x78) {
printf("little-endian\n");
} else {
printf("big-endian\n");
}
return 0;
}
Другие советы
Простой способ узнать, что такое endiannes, указан в статье Написание независимого от байтов кода на C
const int i = 1;
#define is_bigendian() ( (*(char*)&i) == 0 )
Если у вас установлен Python, вы можете запустить эту однострочную строку, которая будет печатать " little " на машинах с прямым порядком байтов и "большой" на старших порядковых:
python -c "import struct; print 'little' if ord(struct.pack('L', 1)[0]) else 'big'"
«Intel-совместимый» — это не очень точно.
Раньше Intel производила процессоры с прямым порядком байтов, в частности StrongARM и XScale.Они не используют IA32 ISA, широко известную как x86.
Еще в прошлом Intel также выпустила i860 и i960 с прямым порядком байтов, которые также не совместимы с x86.
Далее в истории предшественники x86 (8080, 8008 и т. д.) также не являются x86-совместимыми.Поскольку процессоры 8-битные, порядок байтов не имеет большого значения...
В настоящее время Intel по-прежнему производит процессор Itanium (IA64), который является двусторонним:нормальная работа осуществляется с прямым порядком байтов, но процессор также может работать в режиме с прямым порядком байтов.Действительно, он может запускать код x86 в режиме с прямым порядком байтов, но родной ISA не является IA32.
Насколько мне известно, все процессоры AMD были x86-совместимы с некоторыми расширениями, такими как x86_64, и, следовательно, обязательно имели прямой порядок байтов.
Ubuntu доступна для x86 (с прямым порядком байтов) и x86_64 (с прямым порядком байтов), с менее полными портами для ia64 (с прямым порядком байтов), ARM(el) (с прямым порядком байтов), PA-RISC (с прямым порядком байтов, хотя процессор поддерживает оба варианта), PowerPC (обратный порядок байтов) и SPARC (обратный порядок байтов).Я не верю, что существует порт ARM(eb) (big-endian).
В ответ на ваш последний вопрос ответ - нет. Linux способен работать на машинах с прямым порядком байтов, таких как PowerMac старого поколения.
Вы должны загрузить версию Ubuntu, предназначенную для машин с прямым порядком байтов. Я знаю только о PowerPC версиях. Я уверен, что вы можете найти место с более общей реализацией с прямым порядком байтов.
/* by Linas Samusas */
#ifndef _bitorder
#define _bitorder 0x0008
#if (_bitorder > 8)
#define BE
#else
#define LE
#endif
и используйте это
#ifdef LE
#define Function_Convert_to_be_16(value) real_function_to_be_16(value)
#define Function_Convert_to_be_32(value) real_function_to_be_32(value)
#define Function_Convert_to_be_64(value) real_function_to_be_64(value)
#else
#define Function_Convert_to_be_16
#define Function_Convert_to_be_32
#define Function_Convert_to_be_64
#endif
если LE
unsigned long number1 = Function_Convert_to_be_16(number2);
* макрос вызовет реальную функцию и преобразуется в BE
если BE
<*>* макрос будет определяться как слово, а не как функция, а ваш номер будет заключен в квадратные скобки