Определить 32/64 битную архитектуру в сборке - PullRequest
6 голосов
/ 03 апреля 2010

Я перечитал этот вопрос и подумал, может ли принятый ответ также определить способ архитектуры Например, в asm я мог бы вставить слово в стек и затем проверить SP. Сравните новый SP со старым SP:

Разница 4 означает 32 бита
Разница 8 означает 64 бит

Прав ли я в этом мышлении?

Ответы [ 2 ]

6 голосов
/ 03 апреля 2010

Нет, поскольку размер вашего стека зависит от того, в каком режиме вы работаете (реальный, защищенный, long / 64, vm86, smm и т. Д.), А не от архитектуры. Например, если ваша сборка работает в защищенном режиме, ваш стек будет 32-битным (или 16-ти, если ваши операнды 16-битные), даже если ваш процессор x86-64.

Как и кто-то в упомянутых комментариях, CPUID - единственный надежный способ узнать, какова ваша архитектура.

0 голосов
/ 22 июня 2018

Для машинного кода, который определяет, в каком режиме он работает, см. Эту функцию машинного кода code-golf x86, которая возвращает 16, 32 или 64: Определите версию вашего языка . Одни и те же байты машинного кода дают разные результаты в зависимости от того, в каком режиме они декодируются.

Или только 32 против 64, см. фрагмент машинного кода полиглота x86-32 / x86-64, который обнаруживает 64-битный режим во время выполнения?

В большинстве случаев вам не нужно обнаруживать текущий режим, потому что вы знаете, для чего был скомпилирован / собран ваш код. (например, в NASM, %ifidn __BITS__ 32 или проверка %ifidn __OUTPUT_FORMAT__, elf32, которая также работает в YASM.)


Чтобы определить возможности ЦП независимо от текущего режима, используйте CPUID. Как определить тип архитектуры процессора во время выполнения с GCC и встроенным asm? (или использовать cpuid.h: Как я могу назвать "cpuid" в Linux? )

Это все еще не говорит вам, будет ли ОС, под которой вы работаете, поддерживать 64-битные исполняемые файлы ; если вы хотите знать, что вам нужно просто проверить, что вы работаете под 64-битной ОС. CPUID не может помочь вам в этом: механизмы 32-битных программ для запроса ОС, конечно, зависят от ОС.

ИМО "архитектура" вашего ЦП - неправильный вопрос, почти во всех случаях. (т. е. если вы не пишете свое собственное ядро ​​или не пишете программу CPU-info). Знание этого не поможет вашей программе решить, что делать.

32-битные x86-процессоры не выпускались годами и становятся все более и более редкими. Но 32-разрядные ОС все еще используются на 64-разрядных процессорах.

...