Встроенная сборка C / C ++ [с циклами C] - PullRequest
0 голосов
/ 16 января 2011
#include <stdio.h>

#define OPT //define for assembly

int main()
{
 char chr;
 for(chr = 'A' ; chr <= 'Z' ; chr++)
 {
  #ifdef OPT
  __asm
  {
   lea eax,chr
   push eax
   mov eax, putchar
   call eax
   pop ebx
  }
  #endif

  #ifndef OPT
  putchar(chr);
  #endif 
 }
 return 0;
}

При использовании ассемблерного кода все, что происходит, - это случайный символ-мусор.Обратите внимание, что это в синтаксисе intel.

Также: я изучаю встроенную сборку, как бы вы получили возвращаемое значение вызываемой функции (через mov eax, func, затем вызовите eax или эквивалент?)

Ответы [ 2 ]

4 голосов
/ 16 января 2011

Не работает, потому что инструкция lea предназначена для получения адреса переменной.(+1 к zebarbox для этой заметки.) Нам нужно значение chr, а не его адрес, поэтому мы используем его вместо этого:

movsx eax,chr

Эта псевдоинструкция будет скомпилирована примерно так:

movsx eax,[ebp-4]

Вы также можете написать putchar (chr), поставить точку останова, запустить приложение и посмотреть в окно разборки, чтобы увидеть, как оно скомпилировано.

Обратите внимание, что я использую movsx потому что chr это char, и мне нужен здесь меч.Если бы chr был int, я бы просто использовал инструкцию mov .

Кроме того, вы не можете использовать pop ebx , потому что ebx не должен изменяться здесь.Используйте pop eax или add esp, 4 вместо.

1 голос
/ 16 января 2011

Вот ваш правильный код:

int c = chr;
__asm
{
   mov  eax, c
   push eax
   mov  eax, putchar
   call eax
   pop  ebx
}

Невозможно переместить chr на eax из-за конфликта размеров.Поэтому я использовал 'c' типа int!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...