VC++ __asm{} вставка и регистр управления

Тема в разделе "LANGS.C", создана пользователем newb, 27 янв 2010.

  1. newb

    newb New Member

    Публикаций:
    0
    Регистрация:
    4 июн 2008
    Сообщения:
    39
    Подскажите как в ВС++ (32бита) можно сделать команду mov eax, cr0
    __asm mov eax, cr0 --- показывает ошибку
     
  2. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    ; 0F20C0 mov eax, cr0

    Записать в виде опкода, кажется так:

    db 0x0F20C0
     
  3. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    asm {
    db 0Fh
    db 20h
    db 0C0h
    }
     
  4. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Удалите первый и второй посты пжлста, верно вот так
    Код (Text):
    1. asm  {
    2. db 0Fh
    3. db 20h
    4. db 0C0h
    5. }
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    так тоже неверно.
     
  6. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    JCronuz разве VC поддерживает db? насколько я помню, нужно писать _emit или что-то типа этого..
     
  7. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Верно.
    Можно _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.
    Хотя он в пакете и так есть если пакет полный.
     
  8. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    cppasm хех... я думал кириллицей написано ВижалС++ :)))
     
  9. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Я все проверил - работает, а в MSC++, через _emit
    Код (Text):
    1. __asm  {
    2. _emit 0x0F
    3. _emit 0x20
    4. _emit 0x0C0
    5. }
     
  10. newb

    newb New Member

    Публикаций:
    0
    Регистрация:
    4 июн 2008
    Сообщения:
    39
    http://msdn.microsoft.com/en-us/library/h70hd396.aspx

    Visual c++ нельзя юзать DB DD DW DQ и т.д.
     
  11. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    и поэтому ты пишешь на Borland C++? эмит намного хуже db?
     
  12. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Не факт что он пишет на Borland :)
    Я просмотрел, в названии темы написано VC++.
    Короче писать надо по-человечески, потому что VC++ и BC++ это немного разные вещи.
    Если студия, через _emit делается аналогично.
     
  13. newb

    newb New Member

    Публикаций:
    0
    Регистрация:
    4 июн 2008
    Сообщения:
    39
    Код (Text):
    1. __asm  {
    2. _emit 0x0F
    3. _emit 0x20
    4. _emit 0x0C0
    5. }
    Пишу теперь так... всё равно ругается на опкод, привилегированная инструкция.
    Для проверки, написал другой опкод
    Код (Text):
    1.     __asm {
    2.         __emit 0x90;
    3.         __emit 0x90;
    4.         __emit 0x90;
    5.         __emit 0xBA;
    6.         __emit 0x42;
    7.         __emit 0x41;
    8.     };
    который сработал... Но опять же, это не решило моей проблемы с "mov eax, cr0".
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    newb
    На нулевом уровне привилегий значит юзается, а выше вызывает исключение общей защиты.
     
  15. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Кто ругается, компилятор?
    Не верю, у меня студия компилирует.
    Да и нечего ей больше делать как проверять машинный код вставленный вручную.
    То что программа падает - так чего ты ожидал в Ring3? MOV в/из CRx - привилегированная команда.

    Если очень хочется, то вот:

    Код (Text):
    1. #include<stdio.h>
    2.  
    3. int __declspec(naked) get_cr0(void)
    4. {
    5.     _asm{
    6.             // SMSW AX
    7.             _emit 0x0F
    8.             _emit 0x01
    9.             _emit 0xE0
    10.             ret
    11.         }
    12. }
    13.  
    14. int main(void)
    15. {
    16.     printf("CR0=%08X\n",get_cr0());
    17.     return 0;
    18. }
     
  16. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    По мануалам в 32-битном режиме SMSW AX модифицирует EAX: AX - младшие 16 бит CR0, старшие 16 бит EAX не определены.
    По факту в EAX заносится значение CR0 включая старшие биты тоже.
     
  17. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    magic %)
     
  18. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Код (Text):
    1. #include <stdio.h>
    2. #include <intrin.h>
    3.  
    4. int main(void)
    5. {
    6.     printf("CR0=%08X\n", __readcr0());
    7.     return 0;
    8. }
    Компилируется в x86 и x64.
     
  19. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    компилится, но не работает. только в дровишках.
     
  20. newb

    newb New Member

    Публикаций:
    0
    Регистрация:
    4 июн 2008
    Сообщения:
    39
    Хорошо, давайте я тогда разверну тему (чтобы до меня дошло). Как перейти в защищенный режим проца (через vс++)?