14 / 10 / 1
Регистрация: 28.04.2009
Сообщений: 219

Встроенный asm не понимает метки (GCC).

28.05.2009, 20:39. Показов 12876. Ответов 64
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C
1
2
3
4
5
6
7
8
9
10
11
12
unsigned int iFactor(unsigned int n){
//(n==0)=>1; переполнение=>вернуть 0
//unsigned long long f; unsigned long f1; 
unsigned int f2=1;
for (;n;n--){
    f2*=n;
    asm ("jo OUT1");//при переполнении - return 0;
    }//for(n) end
return f2;
OUT1:
return 0;
}
Uncnown reference to OUT1, говорит.
Только не думайте, что я, как чуть что - сразу спрашивать бегу. Искал...
(Вообще, вроде должен видеть все метки и к переменные, "как свои". Так я думал...)

Добавлено через 9 часов 14 минут 6 секунд
Пробовал в операнд (имя метки) добавлять "_" (одно нижнее подчёркивание) - нет...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.05.2009, 20:39
Ответы с готовыми решениями:

Встроенный asm и 64-битные регистры
Всем привет! Попробовал записать в 64-битный регистр ( R8 ) данные, на что студия ответила что не знает что это такое вообще. ...

Встроенный asm не видит метку (Borland 3.1)
Вот кусок кода: void fdc_out(unsigned char parm) { _asm { mov dx,3F4h // Порт основного состояния ...

AVRstudio 4 + GCC + ASM
Доброго времени суток! У меня назрел вопрос - можно ли использовать при написании использовать самописные функции на ассемблере? Если...

64
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
01.06.2009, 14:48
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Evg Посмотреть сообщение
Если под "ret" вы подразумеваете операцию возврата из процедуры, то этого недостаточно. Вы делаете выход из процедуры, но результат в нужный регистр (или стек) не записываете
Ничто тебе не мешает его туда записать. Под ret я имею ввиду ассемблерный код возврата, или набор команд для возврата, зависит от того, откуда убегаем и как.
0
14 / 10 / 1
Регистрация: 28.04.2009
Сообщений: 219
01.06.2009, 14:50  [ТС]
Ну, return компилится в последовательность (как минимум, регистры восстанавливает перед выходом), в самом конце которой, конечно, ret.
А какие восстанавливать - фиг угадаешь (хотя, возвращаемое значение - знаю, в EAX). Но что толку...
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
01.06.2009, 14:52
C
1
2
3
4
5
6
7
8
9
10
   asm("jmp one");
   asm("movl $0x1, %eax\n\t"        делаю код возврата
"add $0x4, %esp\n\t"
"pop %ecx\n\t"          восстанавливаю регистры
"pop %ebp\n\t"
"lea    -0x4(%ecx),%esp\n\t"
"ret");      выхожу с кодом возврата из %eax
   asm("one:");
   printf("Hello\n");
   return 0;
Соответственно, у себя по коду уведите, как че.
Еще можно, наеврное, заюзать напрямую адрес в проге и сделать джамп на него, а не на метку. Как этот адрес получить уже другой интересный вопрос. Правда, я сейчас на работе, некогда немного...
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
01.06.2009, 14:56
Цитата Сообщение от Ultrator Посмотреть сообщение
Ладно, хорошо.
Может, в C есть условный переход по флагам?

(Если нет, тогда вообще не понимаю, как же для МК на нём пишут? Заменить на нечто другое, ессно, можно, но это выльется уже не в одну инструкцию, и даже не в две...)
Ты хоть объясни, что ты хочешь-то?

Добавлено через 1 минуту 58 секунд
Цитата Сообщение от Vourhey Посмотреть сообщение
Ничто тебе не мешает его туда записать. Под ret я имею ввиду ассемблерный код возврата, или набор команд для возврата, зависит от того, откуда убегаем и как.
Таким я бы занимался только в том случае, если на 100% знаю, какой код сгенерил бы в этом месте компилятор. Учитывать надо то, что процедура может про'inline'иться, надо также понимать, что в прологе процедуры могут быть какие-то действия, для которых нужны будут встречные действия перед возвратом из процедуры. Т.е. с такмими вещами я бы не рекомендовал баловаться

Добавлено через 2 минуты 24 секунды
Цитата Сообщение от Vourhey Посмотреть сообщение
Соответственно, у себя по коду уведите, как че.
Еще можно, наеврное, заюзать напрямую адрес в проге и сделать джамп на него, а не на метку. Как этот адрес получить уже другой интересный вопрос. Правда, я сейчас на работе, некогда немного...
Проще тогда вообще весь код на ассемблере написать. Ultrator, пока ты не объяснишь толком, что ты делаешь, так и будет, мы тебе даём советы, которыми ты скорее всего не сможешь чётко воспользоваться.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
01.06.2009, 14:56
Цитата Сообщение от Evg Посмотреть сообщение
Таким я бы занимался только в том случае, если на 100% знаю, какой код сгенерил бы в этом месте компилятор. Учитывать надо то, что процедура может про'inline'иться, надо также понимать, что в прологе процедуры могут быть какие-то действия, для которых нужны будут встречные действия перед возвратом из процедуры. Т.е. с такмими вещами я бы не рекомендовал баловаться
Ты же компилишь, ты можешь узнать все, что тебе надо. Это не "баловаться", а один из вариантов решения.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
01.06.2009, 14:58
Цитата Сообщение от Vourhey Посмотреть сообщение
Ты же компилишь, ты можешь узнать все, что тебе надо. Это не "баловаться", а один из вариантов решения.
Только при любом изменени в коде процедуры надо будет проверять, как бы компилятор построил возврат. Да и проще ручками написать return. Проблема то была не в построении return'а, а в том, что компилятор удалил код, который выглядит как недостижимый
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
01.06.2009, 15:01
Там проверять-то. 5 секунд.
Ну у кого есть время пусть и разбирается с тем, почему компилятор удаляет код после return. Я просто показал свое решение.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
01.06.2009, 15:03
Цитата Сообщение от Vourhey Посмотреть сообщение
Там проверять-то. 5 секунд.
Ну у кого есть время пусть и разбирается с тем, почему компилятор удаляет код после return.[/QUOTE]

А что тут разбираться? Я уже 3 раза объяснил, почему
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
01.06.2009, 15:06
Я не читал вашу переписку, что была до. Тогда я неправильно сформулировал. Пусть разбирается, как обойти это
Я не говорю, что мое решение, зэ бэст. Просто это первое, что пришло мне в голову в цейтноте Оно вполне рабочее и имеет право на существование. Будет время, можно лучше подумать над этим вопросом.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
01.06.2009, 15:13
Цитата Сообщение от Vourhey Посмотреть сообщение
Я не говорю, что мое решение, зэ бэст. Просто это первое, что пришло мне в голову в цейтноте Оно вполне рабочее и имеет право на существование. Будет время, можно лучше подумать над этим вопросом.
Пока не увидим нормальную постановку задачи или хотя бы объяснение на пальцах, а что нужно, о каких-то решениях в общем-то можно и не говорить
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
01.06.2009, 15:16
Тем более.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
01.06.2009, 15:21
Кстати, если для самого первого поста заменить "asm ("jo OUT1")" на "goto OUT1", то конкретно для этого примера получается правильный код. Или "jo" это переход с учётом флага состояний?
0
14 / 10 / 1
Регистрация: 28.04.2009
Сообщений: 219
01.06.2009, 20:32  [ТС]
Или "jo" это переход с учётом флага состояний?
Разумеется.
(но, теперь я понял, там даже не jo, а jc должно быть, хотя это OFF)
Функция должна считать факториал и при переполнении возвращать 0.
Хотелось сделать максимально быструю, насколько возможно

Добавлено через 3 минуты 8 секунд
А постановка задачи - очень проста: сделать такой переход
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
01.06.2009, 21:20
Собственно постановку задачи понял. Поскольку из процедуры есть возврат по переполнению, но, как мне видится, на Си + вставки максимальную производительность не выжать. Проглядел коды glibc и linux'а - нигде не видел вставок с передачей управления на другу вставку внутри процедуры

Если исходить из того, что возврат по переполнению - нечастое действие, то могу предложить читерский код. Но для этого операцию умножения надо будет засунуть вовнутрь вставки (ибо использование умножения отдельно, а перехода по флагу отдельно - некоректно с точки зрения концепции вставки), только объясни, как пишется код для "f2*=n" на ассемблере

Но вообще такую вещь надо целиком на ассембелер ваять. Либо весь цикл делать на ассемблере
1
14 / 10 / 1
Регистрация: 28.04.2009
Сообщений: 219
01.06.2009, 21:37  [ТС]
Ну, наверно, только так.
Получится что-то типа
...iFactor(...){
asm(...);
return то_что_надо;
}

Причём, в самом asm, так понимаю, никаких ret лучше не делать... Эх-х!
Ну, с этим-то справлюсь.

"Что позволено Гераклу,
Не позволено в gcc"
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
01.06.2009, 22:05
Читерский метод заключается в следующем:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
unsigned int iFactor (unsigned int n)
{
  unsigned int f2=1;
 
  for (;n;n--)
  {
    f2*=n;
    asm volatile ("jc OUT1");
  }
 
  return f2;
}
 
// А это так называемая asm entry. Т.е. код вне процедуры, который компилятор не удалит
asm ("OUT1: \n"
     ""); // <---- вот тут пишем код для возврата нуля
Однако этот метод нечестный, потому как ассемблерная вставка имеет входной параметр, который не описан, а именно - флаг состояния. И в режиме с оптимизациями компилятор теоретически может этот флаг каким-то макаром испортить (ибо не знает, что он используется во вставке)

Более честно было бы заменить 7-8 строки и полностью это место сделать на ассемблерной вставке

C
1
2
3
4
5
  for (;n;n--)
  {
    asm ("<код умножения> ; jc OUT1"
         : "+r" (f2) : "r" (n));
  }
При этом все эти читерские методы довольно кучерявые. Идеально правильным вариантом было бы написать

C
1
2
3
4
5
6
7
8
9
unsigned int iFactor (unsigned int n)
{
  unsigned int res;
 
  asm ("<весь код умножения, в случае переполнения запись нуля в res>"
       : "=&r" (res) : "r" (n));
 
  return res;
}
Этот вариант у тебя будет на 100% честный и будет железно работать на компиляторе любой версии и с любыми опциями оптимизаций

Добавлено через 36 секунд
Интеловской системой команд не владею, а потому нужные коды написать не смог
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
02.06.2009, 07:52
Проблему с джампом решили тем, что избавились от джампа. Мдя... стоило разводить...
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
02.06.2009, 08:07
Цитата Сообщение от Vourhey Посмотреть сообщение
Проблему с джампом решили тем, что избавились от джампа. Мдя... стоило разводить...
От jmp'а не избавились. Просто в "правильном" случае он оказывается внутри единственной вставки
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
02.06.2009, 08:35
Избавились. Мы избавились от джампа через ретурн. Че ж ты какой непонятливый

Добавлено через 1 минуту 9 секунд
Мне же интересно решение первоначальной задачи.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
02.06.2009, 10:50
Цитата Сообщение от Vourhey Посмотреть сообщение
Избавились. Мы избавились от джампа через ретурн. Че ж ты какой непонятливый
Всё равно не понял, что ты имеешь в виду. Я бы написал код как нужно, просто не умею под интел писать. Если кто-нибудь хоть как-нибудь напишет, то я нормально это в вставку заверну
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.06.2009, 10:50

Нужно вставить блок на асме, но он не понимает asm и __asm
VC понимает директиву __asm, я пишу в данное время под Linux c компилером g++ v.3.0 нужно вставить блок на асме... Но он не понимает...

Asm вставки в AVR GCC
Есть у кого-то описание как писать эти _страшные_ вещи? Конструкция подразумевающая всего лишь swap регистра, превращается в: #define ...

STM32 + ASM + arm-none-eagi-gcc = непонятки
Скачал я с сайта ARM документик &quot;Sortix -M3 Devices Kimeric User Guide&quot;. Смотрю там раздел &quot;The Sortix-M3 Instruction Set. Но компилятор на...

Использование внешних переменных в asm вставке и компиляцией gcc
Есть такой код для выполнения операций со входной строкой (функциональная часть сейчас неважна): #include &lt;iostream&gt; ...

Реализовать 2 функции с использованием языка C и конструкции asm компилятора gcc
формат binary16 стандарта IEEE 754-2008. В прототипах функций, приведённых ниже, обозначается как fp16_t /* * Возвращает экспоненту...


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

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

Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru