Проблема с invoke assembler в vc++

Тема в разделе "WASM.ASSEMBLER", создана пользователем Kalten Bruner, 11 дек 2005.

  1. Kalten Bruner

    Kalten Bruner New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2005
    Сообщения:
    3
    Адрес:
    Russia
    Доброго времени суток!

    Проблемка такая пишу прогу на c++ с вставками asm'a.

    Я не пониманию некоторых кривостей VC++ компилятора, а именно:

    void GetVendor(char Vendor[12]){

    __asm{

    xor eax,eax;

    cpuid;

    mov dword ptr[Vendor+4],ebx;//а должно быть

    // mov dword ptr{Vendor+0],ebx

    mov dword ptr[Vendor+8],edx;

    // mov dword ptr[Vendor+4],edx

    mov dword ptr[Vendor+12],ecx;

    // mov dword ptr[Vendor+8],ecx

    }

    }

    Значения подобраны в ручную, что бы строка выводимая на экран соответствовала должной.



    А конструкция mov byte ptr[StepID],al; вообще не пашет!

    Т.е переменная StepID не изменяется, какое значение задашь в программе такое и будет. Скажите как правильно надо писать??

    Заранее спасибо!
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    А при чём тут invoke?



    И вообще код неправильный.
    Код (Text):
    1. void get_vendor(char* pVendor){
    2.     __asm{
    3.         xor     eax,eax
    4.         cpuid
    5.         mov     eax,pVendor
    6.         mov     [eax],ebx
    7.         mov     [eax+4],edx
    8.         mov     [eax+8],ecx
    9.     }
    10. }
    11.  
    12. void main()
    13. {
    14.     char vendor[13];
    15.     vendor[12] = 0;
    16.     get_vendor(vendor);
    17.     printf("cpu vendor string: %s\n",vendor);
    18. }
    19.  
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    IceStudent

    (char**)&vendor

    Кто тебя такому научил?
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Сам научился. А разве не работает?
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    IceStudent

    А разве не работает?

    Программа? Наверное, работает.



    Я по стилю.

    Зачем (char**)&?

    Посмотри любую подпрограмму, принимающую буфер для строки, обычно это выглядит так:
    Код (Text):
    1. foo(char *buf)
    2. {
    3. ...
    4. }
    5. ...
    6. //а обращение к ней
    7. char buf[13];
    8. ...
    9. foo(buf);
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Да, верно. Просто сбило то, что нужен указатель на буфер, а в сях имя массива - указатель на первый символ.
     
  7. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Не помню почему не стал использовать inline ф-цию, вместо этого написал такой макрос:
    Код (Text):
    1.  
    2. #define GET_VENDOR_STRING(buffer)               \
    3. {                                               \
    4.     __asm   xor     eax, eax                    \
    5.     __asm   cpuid                               \
    6.     __asm   mov     dword ptr buffer[0], ebx    \
    7.     __asm   mov     dword ptr buffer[4], edx    \
    8.     __asm   mov     dword ptr buffer[8], ecx    \
    9.     __asm   mov     byte ptr buffer[12], 0      \
    10. }
    11.  
    12. // использование
    13.     char            vendor_string[4*4];
    14.     GET_VENDOR_STRING(vendor_string);




    В новых MSVC есть:
    Код (Text):
    1. void __cpuid(
    2.    int* CPUInfo,
    3.    int InfoType
    4. );
    Parameters

    [out] CPUInfo



    The information returned in an array of four integers.

    [in] InfoType



    A code indicating the type of information to be retrieved.
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    S_T_A_S_

    А в новых - это в каких? В справке от 2003 нету, в win2k3sp1 PSDK тоже не видать intrin.h.
     
  9. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Новые - это 2005

    MSDN
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Понятно.