Привет всем! Необходимо программно определить разрядность процессора. Кто нить знает как? Пусть даже просто куда нить зайти и глазами посмотреть
Просто: mov eax,xxxxxxxxh jmp short _16bit _32bit: ... _16bit: ... (переводишь в машинный код первую инструкцию если ты в 32 бита, то вторая инструкция поглащается первой, иначе переход на _16bit)
PROFi это не разрадность процессора а разрядность текущего сегмента определится (если определится...)
Определение разрядности процессора довольно проблематично. Прежде всего, проверим, не 16-разрядный ли проц нам попался: Код (Text): ;пока используется 16-битный код. Мы, само собой, ;в реальном режиме (или в V8086). pushf pop ax test ax,8000h jnz l_ItIs8086Processor or ax,0F000h push ax popf pushf pop ax test ax,0F000h jnz l_ItIs32Or64Processor l_ItIs16BitProcessor: ... l_ItIs8086Processor: Здесь используется модификация регистра флагов и его анализ: 1. У 8086/8088-процессоров бит 15 регистра flags всегда установлен. У более "старших" процессоров он всегда сброшен. Поэтому если pushf/pop ax даёт в регистре ax установленный 15-й бит, это 16-битный процессор. 2. У 32-разрядных процессоров при попытке установить биты 12-15 (например, по popf) бит 15 не установится, бит 14 установится, а биты 12,13 установятся только при CPL=0 (в противном случае их не удастся изменить). Поэтому, сделав popf/pushf и проанализировав полученное значение, можно определить разрядность процессора. Точнее, возможность выполнения на нём 32-битного кода. Однако сейчас уже есть 64-битные процессоры, которые тоже могут выполнять 32-битный код. Отличить 32 и 64-разрядные процессоры можно с помощью CPUID. Код (Text): xor eax,eax inc eax cpuid ;Теперь смотрим, есть ли нужное расширение test edx,40000000h jnz l_ItIsIntel64BitProcessor ;64-бит. процессор от Intel ;Смотрим далее mov eax,80000000h cpuid ;проверка на AMD-процессор cmp eax,80000000h jbe l_ItIs32BitProcessor mov eax,80000001h ;получим расширения AMD cpuid test edx,20000000h jnz l_ItIsAMD64BitProcessor ;64-битный процессор от AMD. ;Иначе - 32-битный: l_ItIs32BitProcesor: ... l_ItIsIntel64BitProcessor: ... l_ItIsAMD64BitProcessor: ... Только предварительно нужно определить наличие CPUID (если можно программно модифицировать бит 21 регистра eflags, то CPUID поддерживается. Если нет, то это НЕ 64-битный процессор).
Alexey2005 верно для x86 архитектуры, но неверно для "процессора" в общем, как, собственно говоря, и был задан вопрос...
infern0 Погонять тесты работы с тем же АЛУ и с памятью (при отключенном кэшировании), при операциях над данными размером с "разрядность" процессор по идее покажет максимальную производительность.
на мой взгляд это разновидность задачи определения процессора , только более простая можно предложить такой алгоритм try { asm ia8instr; asm ia16instr; asm ia32instr; asm ia64instr; } catch (...) { опеределим где произошло исключение; } н
Посмотри EXAMPLE из TASM 5.0,называется CPUID.А если запустить MOV EAX,0 на 16-bit, то получишь в ответ INVALID OPERATION CODE или хуже. Тоже и некоторых других случаях.