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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как скомпилировать проект чтобы вложились нужные библиотеки!!! http://www.cyberforum.ru/cpp/thread61994.html
Привет, народ может поможете. Как мне скомпилировать проект чтобы в папке с прогой, С++ вложил все нужные ей библиотеки, dll? (С++ Архитект 2009) ..............
C++ Игровой движок Какой движок бесплатный для комерческого использования лутше!Сейчас я разрабатываю игру можете вступить к нам у нас 3 программиста 2 модельера и 1 звукарь но я не об этом!Мне нужен двиг с хорошей графикой и эфектами (дым огонь и т.д) http://www.cyberforum.ru/cpp/thread61966.html
C++ Масивы в с++
В общем мне потребовалось написать лабу на тему "Строки" следующего содержания : "Ввести строку из нескольких фамилий отделенных запятыми , вставить имена для каждой фамилии и вывести на экран" У меня есть одна идея, как это осуществить- путём создания еще 1 массива и поиском в введенной строке запятой ,переносом фамилии до запятой во 2 массив,далее переносом имени и т.д....Но помоему есть...
C++ Microsoft Visual С# 2005
Доброго времени суток господа программисты=) у меня 2 вопроса есть по поводу Microsoft Visual C# 1) как сделать чтоб приложение не отображалось в процессах диспетчера задач(CTR+ALT+DEL) 2)как полностью убрать верхнюю синюю шапку в окне приложения ну прост оч надо помогите плиз
C++ Run-Time Check Failure #2 - Stack around the variable 'MX' was corrupted. http://www.cyberforum.ru/cpp/thread61757.html
Решаю задачу. Вот код: #include <iostream> using namespace std; int main () { int S; long long MX; for (int i=0;i<=100;i++) MX=0;
C++ Пропадают символы из char В классе есть метод, в который я передаю указатель на строку char. при пошаговой компиляции, выяснил, что когда я присваиваю эту строку переменной типа AnsiString, строка char обрезается по первый символ. Кто встречался с такой ошибкой, поделитесь опытом её решения, заранее спасибо. Вот код, может поможет: void TMyMask::insert_mask(char *stroka, int *mas) { unsigned int i=0,j=0,m=0;... подробнее

Показать сообщение отдельно
Evg
Эксперт CАвтор FAQ
17274 / 5528 / 345
Регистрация: 30.03.2009
Сообщений: 15,041
Записей в блоге: 26
11.11.2009, 16:10     Ошибка компиляции ассемблерной вставки
По поводу 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. А общего механизма нет, в каждом компиляторе он реализован по-своему
 
Текущее время: 02:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru