Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.63
vlitomsk
5 / 4 / 3
Регистрация: 23.03.2010
Сообщений: 43
#1

inline assembler в СИ - Assembler

09.04.2010, 18:55. Просмотров 2048. Ответов 11
Метки нет (Все метки)

Доброго!
каким образом можно связать внешную переменную и встроенный ассмблер в Си?
чтоб было примерно так:
C
1
2
int abc = 666;
asm("mov abc, 777"); // не знаю как на AT&T синтаксисе. но с интел можно скомпилировать (в gcc по карйней мере,если опцию -masm=intel задать :)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2010, 18:55
Я подобрал для вас темы с готовыми решениями и ответами на вопрос inline assembler в СИ (Assembler):

GCC Inline Assembly перевести в Visual Studio Inline Assembler
Здравствуйте. Есть код на GCC Inline Assembly и его нужно перевести в Visual...

Inline assembler mingw
Добрый вечер ув. пользователи форума. Возникла проблема с ассемблером, и его...

переписать код в GCC Inline Assembly
Добрый день! cld lea di,buffer mov dx,01f0h ...

Assembler
Объясните смысл написанного mov ax, +5 Вторая часть, это как я понимаю...

Assembler????....
Где можно найти программу Assembler????....

Assembler отладчик
Здравствуйте,как можно увидеть картинку(jpeg,gif) через отладчик?

11
Evg
Эксперт CАвтор FAQ
18937 / 6898 / 512
Регистрация: 30.03.2009
Сообщений: 19,432
Записей в блоге: 30
09.04.2010, 23:48 #2
Зависит от компилятора
0
Ivan_32
28 / 24 / 4
Регистрация: 03.02.2010
Сообщений: 66
10.04.2010, 00:51 #3
Да собственно вот так хотя бы:
C
1
2
3
4
5
6
7
8
9
int var=0,var2=0;
_asm
{
        mov var,1
    mov dword ptr[var2],15
}
WCHAR tSt[260];
swprintf(tSt,L"Var = %i Var2 = %i",var,var2);
MessageBoxW(0,tSt,0,0);
Вывод будет: Var = 1 Var2 = 15
Это равносильно для MSVS, т.к. в ней что [var] что var - одно и тоже, адрес переменной. За это я честно-говоря и не люблю MASM. Тут непонятно как тогда сделать косвенную адресацию...
0
vlitomsk
5 / 4 / 3
Регистрация: 23.03.2010
Сообщений: 43
10.04.2010, 15:57  [ТС] #4
пишет :
Bash
1
2
undefined reference to `abc'
collect2: ld returned 1 exit status
компилятор GCC, компилирую -masm=intel

Добавлено через 10 минут
ура!!
вопрос решен!
http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html помогло
C
1
2
3
4
5
6
asm(
  "mov %0, 777\n"
  : "=r" (abc)
  :
  :
);
--
Ivan__32, это вроде для виндусятского компилятора.
0
Evg
Эксперт CАвтор FAQ
18937 / 6898 / 512
Регистрация: 30.03.2009
Сообщений: 19,432
Записей в блоге: 30
10.04.2010, 16:50 #5
vlitomsk, в твоём случае хвост можно не писать, т.е. ограничится

C
1
asm ("mov %0, 777" : "=r" (abc));
Однако я бы тебе рекомендовал использовать тот синтаксис ассемблерного написания, который принято использовать под linux'ом. Формат gnu'той ассемблерной вставки слишком сложен для неподготовленного человека и тебе так или иначе придётся смотреть чужие коды. А потому будешь постоянно путаться из-за того, что твой синтаксис - "не как у людей"

Добавлено через 1 минуту
Кстати, в том мануале не написано, но вместо цифрового описания операндов можно им задавать псевдоимена. Точный синтаксис не помню, но вроде бы так

C
1
asm ("mov %[dst], 777" : "=r" [dst] (abc));
1
vlitomsk
5 / 4 / 3
Регистрация: 23.03.2010
Сообщений: 43
10.04.2010, 19:01  [ТС] #6
нет,AT&T синтаксис-то мне понятен. только душа не лежит к нему,чтобы писать
-
а еще непонятно, почему "=r"?
0
Evg
Эксперт CАвтор FAQ
18937 / 6898 / 512
Регистрация: 30.03.2009
Сообщений: 19,432
Записей в блоге: 30
10.04.2010, 19:47 #7
Знак "=" означает, что в этот аргумент идёт запись, а начальное значение этого аргумента нам неважно. Если "+" - значит аргумент и пишется, и читается (т.е. нам важно, как входое значение аргумента, так и выходное). Я в интеловской системе команд плохо разбираюсь, но операция "a += b" в ассемблерном виде запишется примерно так:

C
1
asm ("add %[dst], %[arg]" : "+r" [dst] (a) : "r" [arg] (b));
Добавлено через 30 секунд
С этими вставками я, например, понимаю, как они работают, но очень затрудняюсь внятно объяснить словами
1
vlitomsk
5 / 4 / 3
Регистрация: 23.03.2010
Сообщений: 43
10.04.2010, 19:57  [ТС] #8
спасибо!
0
vlitomsk
5 / 4 / 3
Регистрация: 23.03.2010
Сообщений: 43
20.04.2010, 11:51  [ТС] #9
а можно поинтересоваться, что такое "=t" и "0"?
C
1
 asm ("fcos" : "=t" (result) : "0" (angle));
0
Evg
Эксперт CАвтор FAQ
18937 / 6898 / 512
Регистрация: 30.03.2009
Сообщений: 19,432
Записей в блоге: 30
20.04.2010, 11:59 #10
0 - означает, что операнд использует тот же ресурс, что и операнд 0
что такое t - хз (я не знаю intel'овскую систему команд), но скорее всего плавающий регистр (или что там за тип регистра требуется для операции fcos)
1
vlitomsk
5 / 4 / 3
Регистрация: 23.03.2010
Сообщений: 43
20.04.2010, 12:05  [ТС] #11
ну вообще-то fcos - FPUшная команда) и пишется одинаково что в intel, что в at&t
а можно где-нибудь взять описания этих "=r", "=t" и все что в кавычках?ведь их же не из воздуха берут)
0
Evg
Эксперт CАвтор FAQ
18937 / 6898 / 512
Регистрация: 30.03.2009
Сообщений: 19,432
Записей в блоге: 30
20.04.2010, 13:30 #12
Цитата Сообщение от vlitomsk Посмотреть сообщение
ну вообще-то fcos - FPUшная команда) и пишется одинаково что в intel, что в at&t
Я говорю не про синтаксис, а про систему команд. Я с intel'овским процессором мало знаком

Цитата Сообщение от vlitomsk Посмотреть сообщение
а можно где-нибудь взять описания этих "=r", "=t" и все что в кавычках?ведь их же не из воздуха берут)
В посте #4 уже дали ссылку. В конце раздела 6.1 описано в том числе и "t". А нормальной и внятной документации по ассемблерным вставкам я толком никогда и не видел. Как и у большинства opensource'ного софта нужно постоянно рыться в гугле
1
20.04.2010, 13:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.04.2010, 13:30
Привет! Вот еще темы с решениями:

Вставка assembler'a в С++
Доброго времени суток, изучая вставки assembler'a в С++, столкнулся с таким...

Програма на Assembler
Розробити програму-тест на швидкість введення символів з клавіатури. За...

Assembler + UEFI
Привет всем! Недавно начал потихоньку изучать Assembler(MASM в большей степени)...

Assembler. массивы
Посмотрите, плз... Написать программу, которая вводит с клавиатуры число типа...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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