Почему Inline asm в C ++ / CLI создает ужасную проблему? - PullRequest
1 голос
/ 20 августа 2010

Я использую встроенный ассемблер в C ++ / CLI.Ужасная проблема может быть ошибкой, которую я заметил.Я передал вектор из одного вызова функции в другой.Если я прокомментирую весь фрагмент кода _asm {.... некоторый ассемблерный код здесь} внутри вызываемой функции, где используется вектор, предоставленный ему из другой функции, то нет проблем, если весь вектор будет исправен и успешно скопирован в аргумент вызываемой функциив правильной манере.

Но если uncmment _asm {} я имею в виду, если я использую патч _asm {} в вызываемой функции, он повреждает целые векторы объектов, воздействует на целые повреждения объектов, которые содержат векторы и другие строковые данные, и он просто показывает для всех данныхвнутри объекта, как npos = 4294967295.

Что это?Почему это так?CLI создает проблему, или я использую inline asm я неправильно?

Пожалуйста, помогите мне, потому что я застрял здесь.

             strParamType  = strReturnType;
             if(strParamType.find("IDispatch")!=string::npos)
             {
                 IDispatch* pIDispatch; 
                 _asm
                 {
                   mov  esi,esp 
                       lea  eax,[pIDispatch] 
                   push eax
             }
              }

Здесь Если я вообще ничего не пишу внутри _asm{} даже тогда возникает проблема, которую я описал.

С уважением, Усман

1 Ответ

3 голосов
/ 26 ноября 2011

Из предоставленного вами источника я не могу точно догадаться, что вы намерены делать, но у меня будет несколько замечаний:

  1. Специально для использования _asm в среде .NET необходимо соблюдать ряд правил. См., Например, совет Microsoft .
  2. Ваш код не инициализируется pIDispatch. Я не знаю, что следует в вашем реальном коде, но код ассемблера берет адрес указателя в вашем стеке и снова сохраняет его в стеке. Это вызывает проблемы, если ваш код не пытается инициализировать указатель. Но после предложения if указатель будет вне области видимости!
  3. Ваш код сборки изменяет указатель стека, не восстанавливая его. Это приведет к краху вашего процесса, конечно. Не делайте этого, если вы действительно не знаете, что делаете (например, пишете операционную систему).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...