__asm в Visual C++

Тема в разделе "LANGS.C", создана пользователем serega28, 1 авг 2008.

  1. serega28

    serega28 Member

    Публикаций:
    0
    Регистрация:
    26 мар 2007
    Сообщения:
    115
    Адрес:
    Minsk
    Не знаю почему так работает. Почему
    Код (Text):
    1. mov ecx, [iVal]
    в ECX грузится адрес??? Может в Visual C++ синтаксис другой???


    Код (Text):
    1. DWORD Val
    2.  
    3. __asm
    4. {
    5.   mov Val, esp;
    6.  
    7.   mov eax, Val;
    8.          
    9.   mov ecx, [eax];        // в ECX загружает данные по адресу EAX
    10.  
    11.   mov ecx, [iVal];       // а вот тут в ECX загружает адрес, а мне надо данные.
    12.   mov ecx, [iVal+4];
    13. }
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    mov ecx, dword ptr [iVal];

    ?
     
  3. Subrealist

    Subrealist Member

    Публикаций:
    0
    Регистрация:
    17 июл 2006
    Сообщения:
    134
    Прогони это под отладчиком или задай в настройках генерацию ассемблерного листинга и посмотри, как именно у тебя ассемблируется этот код. И что за значение у тебя в iVal? И какой тип у этой переменной? Если iVal локальная, то ставь скобки, не ставь, пиши DWORD PTR, не пиши - она как была, к примеру DWORD PTR [ebp-0Ch] - так её и останется
     
  4. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    А какая разница что в iVal? А тип DWORD там же написано в листинге
     
  5. Subrealist

    Subrealist Member

    Публикаций:
    0
    Регистрация:
    17 июл 2006
    Сообщения:
    134
    Vilco
    Я вижу DWORD Val, а DWORD iVal почемуто у меня не отображается.
    Насколько я знаю, [] на локальные переменные не влияют. Я предполагаю, что iVal может быть указателем на массив, естественно после
    mov ecx, [iVal];
    в ecx будет адрес массива.
    Может я чего-то туплю, но в mov ecx, [iVal] должно загружаться значение, и если грузиться не оно, интересно, почему так происходит, вот я и спрашиваю, какое там находиться значение и какой у неё тип. Вот пример, корректно собирается под VC 8, везде получаются значения
    Код (Text):
    1. // testasm.cpp : Defines the entry point for the console application.
    2. //
    3.  
    4. #include "stdafx.h"
    5.  
    6.  
    7. int _tmain(int argc, _TCHAR* argv[])
    8. {
    9.     int iVal, Val, Val1;
    10.    
    11.  
    12.     iVal=10;
    13.     Val=0;
    14.     Val1=0;
    15.     __asm{
    16.             mov ecx, [iVal]
    17.             mov Val, ecx
    18.             mov ecx, iVal
    19.             mov Val1, ecx
    20.  
    21.         }
    22.     printf("Val=%d Val1=%d", Val, Val1);
    23.    
    24.     return 0;
    25. }
     
  6. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Да, действительно, не обратил внимания на различие Val и iVal
    Мб автор тож)