Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/58: Рейтинг темы: голосов - 58, средняя оценка - 4.64
14 / 10 / 1
Регистрация: 28.04.2009
Сообщений: 219

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

28.05.2009, 20:39. Показов 12394. Ответов 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
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru