Код ассемблера в коде C ++ - PullRequest
3 голосов
/ 18 мая 2011

Как я могу вставить Intel asm-код в мое приложение c ++? Я использую Dev-C ++.

Я хочу сделать вот что:

int temp = 0;
int usernb = 3;

pusha
mov eax, temp
inc eax
xor usernb, usernb
mov eax, usernb
popa

Это всего лишь пример. Как я могу сделать что-то подобное?

UPDATE: Как это выглядит в Visual Studio?

Ответы [ 5 ]

4 голосов
/ 18 мая 2011

Вы можете найти полное руководство здесь http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

#include <stdlib.h>

int main()
{
     int temp = 0;
     int usernb = 3;

     __asm__ volatile (
          "pusha \n"
          "mov eax, %0 \n"
          "inc eax \n"
          "mov ecx, %1 \n"
          "xor ecx, %1 \n"
          "mov %1, ecx \n"
          "mov eax, %1 \n"
          "popa \n"
          : // no output
          : "m" (temp), "m" (usernb) ); // input
     exit(0);
}

После этого вам нужно скомпилировать что-то вроде:

gcc -m32 -std=c99 -Wall -Wextra -masm=intel -o casm casmt.c && ./casm && echo $?
output:
0

Вам нужно скомпилировать с -masm =Флаг Intel, так как вы хотите синтаксис Intel сборки:)

2 голосов
/ 18 мая 2011

ОБНОВЛЕНИЕ: Как это выглядит в Visual Studio?

Если вы собираете 64-битную версию, вы не можете использовать встроенную сборку в Visual Studio. Если вы создаете 32-битную версию, тогда вы используете __asm для встраивания.

Как правило, использование встроенного ASM - плохая идея.

  1. Вероятно, вы будете производить хуже ASM, чем компилятор.
  2. Использование любого метода ASM в методе, как правило, сводит на нет любые оптимизации, которые пытаются затронуть этот метод (т. Е. Встраивание).
  3. Если вам нужен доступ к специфическим функциям процессора, которые не очевидны в C ++ (например, инструкции SIMD), тогда вы можете использовать гораздо больше в соответствии с языком intrinsics , предоставляемым большинством поставщиков компиляторов. Встроенные функции дают вам всю скорость этой «специальной» инструкции, но таким образом, который совместим с семантикой языка и с оптимизаторами.
2 голосов
/ 18 мая 2011

Это зависит от вашего компилятора.Но из ваших тегов, я полагаю, вы используете gcc / g ++, тогда вы можете использовать gcc встроенный ассемблер .Но синтаксис довольно странный и немного отличается от синтаксиса Intel, хотя он достигает того же.

РЕДАКТИРОВАТЬ: С Visual Studio (или компилятор Visual C ++)это намного проще, так как он использует обычный синтаксис Intel.

2 голосов
/ 18 мая 2011

Вот простой пример, показывающий синтаксис для GCC / Dev-C ++:

int main(void)
{
    int x = 10, y;

    asm ("movl %1, %%eax;"
         "movl %%eax, %0;"
        :"=r"(y)    /* y is output operand */
        :"r"(x)     /* x is input operand */
        :"%eax");   /* %eax is clobbered register */
}
1 голос
/ 18 мая 2011

Если для некоторых упражнений я бы порекомендовал некоторому настоящему ассемблеру избегать встроенного кода, поскольку он может быть довольно запутанным / запутанным.

Некоторые основы использования GCC можно найти здесь .

Если вы готовы попробовать MSVC (не уверен, является ли GCC требованием), я бы посоветовал вам взглянуть на интерпретацию MSVC, которая (на мой взгляд) намного легче читать / понимать, особенно дляобучение ассемблеру.Пример можно найти здесь .

...