Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 53, средняя оценка - 4.85
RNT
Автор FAQ
3134 / 354 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
#1

Ошибка компиляции ассемблерной вставки - C++

08.11.2009, 16:39. Просмотров 6763. Ответов 21
Метки нет (Все метки)

Добрый вечер. Захотелось мне сделать ассемблерную вставку в C++ код. Сделал. Но компилятору MinGW чето не нравится. Выдает следующие ошибки в 8 строке:

error: expected `(' before '{' token
error: expected asm body before '{' token


Что я сделал не так ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
using namespace std;
int main ()
{
    cout << "Сейчас будет звонить!" << endl;
    asm
    {
        /*MOV AH,2
        MOV DL,7
        INT 21H*/
    }
    cout << "Есть!" << endl;
    return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2009, 16:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка компиляции ассемблерной вставки (C++):

Ошибка компиляции - C++
Дана задача с использованием friend-ов. Не могу понять почему программа не видит (Square s(5, 4);) Помогите пожалуйста чайнику) ...

Ошибка сегментирования при компиляции - C++
Когда компилирую через g++ компилируется, при запуске выдает ошибку сегментирования, а при компиляции через NetBeans IDE выдает две ошибки,...

Ошибка компиляции как положительный результат - C++
Товарищи, подскажите, пожалуйста, есть ли возможность средствами плюсов следить за ошибками компиляции? Необходимо в процессе...

Метки в макросах в ассемблерной вставке - C++
В C++ написан макрос с ассемблерной вставкой, который содержит в себе метку &quot;doit&quot; и команду перехода на неё: #define MYMACRO(x, y, z)...

Ошибка компиляции - C++ Builder
при компиляции выскакивает ошибка: undefined symbol 'memo1'....в последней строке кода...в чём ошибка? вот код: #include &lt;vcl.h&gt; ...

Ошибка компиляции - C++ Builder
#include &lt;iostream.h&gt; #include...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
11.11.2009, 15:21 #16
Для интела будет так выглядеть
C++
1
asm ("add %0, %1" : "=m"(x) : "r"(y));
add принимает два операнда. Компилировать надо с флагом intel, иначе не фкурит.

Мне кажется, что проще писать процедуру на асме отдельным файлом и собирать вместе с основным проектом на си, если так хочется поюзать ассемблер.
Evg
Эксперт CАвтор FAQ
17647 / 5871 / 379
Регистрация: 30.03.2009
Сообщений: 16,178
Записей в блоге: 26
11.11.2009, 15:30 #17
Gravity, у тебя задан двухоперандный случай. К тому же правильно помечать "+m", а не "=m". Вариант с оформлением в виде отдельной процедуры (для трёхаргументного вычитания):

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
int
asm_sub (int src1, int src2)
{
  register int dst;
 
  asm ("subl %2, %0" : "=&r" (dst) : "0" (src1), "r" (src2));
 
  return dst;
}
 
int main (void)
{
  printf ("%d\n", asm_sub (15, 23));
  return 0;
}
Добавлено через 25 секунд
Цитата Сообщение от Gravity Посмотреть сообщение
Мне кажется, что проще писать процедуру на асме отдельным файлом и собирать вместе с основным проектом на си, если так хочется поюзать ассемблер.
В этом случае ты зарубаешь возможность inline'а
RNT
Автор FAQ
3134 / 354 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
11.11.2009, 15:59  [ТС] #18
Подскажите пожалуйста книжки или статьи, где можно основательно почитать про то, как делать ассемблерные вставки в C/C++.
Evg
Эксперт CАвтор FAQ
17647 / 5871 / 379
Регистрация: 30.03.2009
Сообщений: 16,178
Записей в блоге: 26
11.11.2009, 16:10 #19
Сообщение было отмечено автором темы, экспертом или модератором как ответ
По поводу inline'а лучше поясню на более конкретном примере. Допустим, мы имеем интерфейс для некоторых небольших действий. Что-то мудрённое писатьне будем, а ограничимся операциями сложения и вычитания (чтобы меньше было в коде текста и проще было понять суть). Пусть интерфейсы называются asm_add и asm_sub соотвественно. Таким образом мы реализуем некие кубики, из которых можно будет строить более объёмные блоки. В данном примере в качестве блока реализуем функцию func от трёх параметров, которая реализует свёртку "x+y-z"

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* Файл t.h */
 
static inline int
asm_add (int src1, int src2)
{
  register int dst;
 
  asm ("addl %2, %0" : "=&r" (dst) : "0" (src1), "r" (src2));
 
  return dst;
}
 
static inline int
asm_sub (int src1, int src2)
{
  register int dst;
 
  asm ("subl %2, %0" : "=&r" (dst) : "0" (src1), "r" (src2));
 
  return dst;
}
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* Файл t.c */
 
#include <stdio.h>
#include "t.h"
 
int
func (int x, int y, int z)
{
  int a, b;
  
  a = asm_add (x, y);
  b = asm_sub (a, z);
  
  return b;
}
В итоге, имеем следующий код:

Код
$ gcc t.c -O2 -S
$ cat t.s
        .file   "t.c"
        .text
        .p2align 4,,15
.globl func
        .type   func, @function
func:
        pushl   %ebp
        movl    %esp, %ebp
        movl    12(%ebp), %edx
        movl    16(%ebp), %ecx
        movl    8(%ebp), %eax
        popl    %ebp
#APP
        addl %edx, %eax
        subl %ecx, %eax
#NO_APP
        ret
        .size   func, .-func
        .ident  "GCC: (GNU) 4.1.2 (Gentoo 4.1.2 p1.1)"
        .section        .note.GNU-stack,"",@progbits
В итоге компилятор все наши static inline процедуры подставил (а коды самих процедур удалил) и мы получили "быструю" функцию func, в которой функциональная часть - это две наши операции addl и subl, всё остальное - это работа по перенесению параметров из стека на регистр и сохранение frame-pointer'а. Если бы мы функции asm_add и asm_sub написале в виде процедур на ассемблере в отдельном ассемблерном файле, то компилятор бы подстановку в принципе не смог сделать и быстрый "блок из кубиков" реализовать бы не получилось

В данном случае весь интерфейс у нас реализован в виде процедур на языке GNU-C, который другие компиляторы не понимают. При использовании другого компилятора нам бы нужно было подхачить только "кубиковый" файл t.h и как-то на языке или каким-либо другим способом написать функции, которые выполняют нужные действия. Пусть они будут не на ассемблере, пусть они получатся медленными, но мы исправили только самый нижний уровень, не трогая при этом весь остальной код. В итоге программу заставили работать, пусть и медленнее, чем можно было бы, но для первого шага этого оказалось бы достаточно. Этот абзац уже относится не столько к ассемблерным вставкам, сколько к технике программирования и реализации архитектурно-зависимых частей в виде маленьких кубиков

Добавлено через 1 минуту
Цитата Сообщение от RNT Посмотреть сообщение
Подскажите пожалуйста книжки или статьи, где можно основательно почитать про то, как делать ассемблерные вставки в C/C++.
Анус состоит в том, что по этому поводу по большому счёту нигде нет внятной литературы. Есть техническая документация по gcc, но она слишком ублюдочная. Это хорошая тема для FAQ'а, но чтоды описать доступно, надо будет попотеть и придумать хотя бы с какого боку начать пояснения. Я имею в виду gcc. А общего механизма нет, в каждом компиляторе он реализован по-своему
RNT
Автор FAQ
3134 / 354 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
11.11.2009, 16:15  [ТС] #20
Цитата Сообщение от Evg Посмотреть сообщение
Анус состоит в том, что по этому поводу по большому счёту нигде нет внятной литературы.
Evg, а как ты это изучил ?
Evg
Эксперт CАвтор FAQ
17647 / 5871 / 379
Регистрация: 30.03.2009
Сообщений: 16,178
Записей в блоге: 26
11.11.2009, 16:27 #21
Копаясь в существующих кодах. К тому же я знаком с внутренним устройством gcc, а формат вставки в общем-то подгонялся под это дело (либо подгоняли наоборот, учитявая упоминание о том, что формат придумалив AT&T - этого я уже не знаю). Никакой нормальной литературы акромя внутренней документации по устройству gcc я тогда так и не нашёл.
Evg
Эксперт CАвтор FAQ
17647 / 5871 / 379
Регистрация: 30.03.2009
Сообщений: 16,178
Записей в блоге: 26
10.04.2010, 16:53 #22
Цитата Сообщение от RNT Посмотреть сообщение
Подскажите пожалуйста книжки или статьи, где можно основательно почитать про то, как делать ассемблерные вставки в C/C++.
Тут человек ссылку подкинул. Я текст не читал, так что не могу сказать, на сколько его сложно будет понять
http://www.ibiblio.org/gferg/ldp/GCC...bly-HOWTO.html
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2010, 16:53
Привет! Вот еще темы с ответами:

Ошибка компиляции - C++ Builder
Доброго времени суток, недоустановил компонент до конца и начались глюки выдаёт такую ошибку

Ошибка компиляции - C++ Builder
Помогите, не могу понять в чем проблема. При компиляции вылетает ошибка: &quot;First chance excaption at $775142EB. Exceprion class...

Ошибка при компиляции - C++ Builder
Почему стало появляться даже при пустой форме стоит лишь подключить fstream:

Ошибка при компилировании ассемблерной вставки - Lazarus
При попытки добавить ассемблерную вставку выдается ошибка: unit1.pas(31,3) Fatal: Selected assembler reader not supported.. независимо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.04.2010, 16:53
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru