Подскажите как в ВС++ (32бита) можно сделать команду mov eax, cr0 __asm mov eax, cr0 --- показывает ошибку
Верно. Можно _asm db 0Fh, 20h, 0C0h А разве вопрос был про Microsoft Visual Studio? BC++ - это Borland C++ for DOS, был такой, последний с поддержкой генерации 32-битного кода для реального режима. newb - как вариант поставь в настройках Options->Compiler->Code generation->Compile via assembler Тогда должно в ассемблерной вставке скомпилировать _asm mov eax,cr0 но нужен будет TASM. Хотя он в пакете и так есть если пакет полный.
Я все проверил - работает, а в MSC++, через _emit Код (Text): __asm { _emit 0x0F _emit 0x20 _emit 0x0C0 }
Не факт что он пишет на Borland Я просмотрел, в названии темы написано VC++. Короче писать надо по-человечески, потому что VC++ и BC++ это немного разные вещи. Если студия, через _emit делается аналогично.
Код (Text): __asm { _emit 0x0F _emit 0x20 _emit 0x0C0 } Пишу теперь так... всё равно ругается на опкод, привилегированная инструкция. Для проверки, написал другой опкод Код (Text): __asm { __emit 0x90; __emit 0x90; __emit 0x90; __emit 0xBA; __emit 0x42; __emit 0x41; }; который сработал... Но опять же, это не решило моей проблемы с "mov eax, cr0".
Кто ругается, компилятор? Не верю, у меня студия компилирует. Да и нечего ей больше делать как проверять машинный код вставленный вручную. То что программа падает - так чего ты ожидал в Ring3? MOV в/из CRx - привилегированная команда. Если очень хочется, то вот: Код (Text): #include<stdio.h> int __declspec(naked) get_cr0(void) { _asm{ // SMSW AX _emit 0x0F _emit 0x01 _emit 0xE0 ret } } int main(void) { printf("CR0=%08X\n",get_cr0()); return 0; }
По мануалам в 32-битном режиме SMSW AX модифицирует EAX: AX - младшие 16 бит CR0, старшие 16 бит EAX не определены. По факту в EAX заносится значение CR0 включая старшие биты тоже.
Код (Text): #include <stdio.h> #include <intrin.h> int main(void) { printf("CR0=%08X\n", __readcr0()); return 0; } Компилируется в x86 и x64.
Хорошо, давайте я тогда разверну тему (чтобы до меня дошло). Как перейти в защищенный режим проца (через vс++)?