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

C++

Войти
Регистрация
Восстановить пароль
 
MeowCoder
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 6
Завершенные тесты: 2
#1

Метки в макросах в ассемблерной вставке - C++

10.12.2016, 19:50. Просмотров 531. Ответов 8
Метки нет (Все метки)

В C++ написан макрос с ассемблерной вставкой, который содержит в себе метку "doit" и команду перехода на неё:
C++ (Qt)
1
#define MYMACRO(x, y, z) __asm{... __asm jc doit ... __asm doit: ...}
Проблема возникает при использовании этого макроса в коде более одного раза:
error C2412: 'doit' : case-insensitive label redefined
Насколько я понял, это из-за того, что фрагмент кода дублируется, и метка вместе с ним. Можно ли как-нибудь скрыть эту метку, чтобы при каждом вызове макроса кусок кода видел только свою метку?

Оформить это в виде макроса - обязательное условие по заданию, так что процедуры вопрос не решают.
Вместо макроса #define пытался сделать ассемблерный macro, но он отвергается inline-asm'ом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2016, 19:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Метки в макросах в ассемблерной вставке (C++):

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

Реализовать ассемблерной вставкой расчет формулы - C++ Builder
День добрый пацаны,ребята (кому как нравиться)!!!! Кто может помогите прошу я в тупике необходимо реализовать формулу(напишу ниже) в...

метки в коде - C++ Builder
такой вот вопросик... можно ли в код вводить какието метки и как правильно это делать ? например metka1: if (i ==0)

Удалить символ в заголовке метки - C++ Builder
Здравствуйте. Прошу совета, как удалить символ в заголовке метки? Моя попытка: Label1->Caption.Delete(0,1); Безрезультатно

Изменение цвета текста метки при наведении курсора - C++ Builder
Подскажите какой код прописать в событии при наведении на лейбел чтобы он был красного цвета а когда убираешь по умолчанию.

Вызов функции в ассемблерной вставке C++. - Visual C++
Нужно ввести строку, объясните как вызвать и как параметры передать. Пусть это будет cin.getline.

8
ФедосеевПавел
Модератор
2272 / 1260 / 516
Регистрация: 01.02.2015
Сообщений: 4,099
10.12.2016, 22:46 #2
Часто во встроенных ассемблерах допускается повторение меток при наличии модификаторов (типа, @@doit) или прагм.
Ещё возможен вариант при использовании синтаксиса masm32 - когда сама метка записывается @@, а обращение к ней или @@f или @@b в зависимости от того, где метка находится впереди или сзади.
1
MeowCoder
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 6
Завершенные тесты: 2
11.12.2016, 11:38  [ТС] #3
У меня вроде masm, но символ собачки сразу вызывает error C2018: unknown character '0x40'
А можно поподробнее про прагмы?
0
ФедосеевПавел
Модератор
2272 / 1260 / 516
Регистрация: 01.02.2015
Сообщений: 4,099
11.12.2016, 12:03 #4
Прагмы - это директивы (указания) компилятору. О них нужно поискать в справке к самому компилятору.
Пример прагмы, которая что-то разрешает компилировать
C
1
#pragma inline
Почитал FAQ для раздела Assembler, MASM, TASM
Выходит, что нет локальных меток.

А вот смотрите, что нашлось в интернет
Метки в стиле Кнута еще никто не отменял,
они оптимальны для вставок,
пример на ассемблере:
Assembler
1
2
3
4
5
6
7
8
9
jmp 1f // Переход к следующему 1:
2:
....
jmp 2f // Переход к следующей 2:
1:
....
jmp 2b // Переход к предыдущей 2:
2:
jmp 1b // Переход к предыдущей 1:
1
MeowCoder
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 6
Завершенные тесты: 2
11.12.2016, 13:17  [ТС] #5
Пишу в VS2013, про прагмы почитат тут https://msdn.microsoft.com/ru-ru/library/d9x1s805.aspx, но для моей ситуации там, кажется, ничего нет.

По поводу метода Кнута - увы
error C2400: inline assembler syntax error in 'opcode'; found 'constant'
0
ФедосеевПавел
Модератор
2272 / 1260 / 516
Регистрация: 01.02.2015
Сообщений: 4,099
11.12.2016, 14:26 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Подобрать смещение по асм коду jc $+15
2
Croessmah
Эксперт CЭксперт С++
13406 / 7556 / 853
Регистрация: 27.09.2012
Сообщений: 18,590
Записей в блоге: 3
Завершенные тесты: 1
11.12.2016, 16:12 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Как вариант:
C++
1
2
3
4
5
6
7
8
#include <iostream>
 
#define MAKE_NAME_(x, y) x##y
#define MAKE_NAME(x, y) MAKE_NAME_(x, y)
 
#define DOIT_LABEL MAKE_NAME(doit, __LINE__)
 
#define MYMACRO(x, y, z) __asm{__asm jc DOIT_LABEL __asm DOIT_LABEL: }
Можно еще в лямбду обернуть:
C++
1
#define MYMACRO(x, y, z) []() {__asm{... __asm jc doit ... __asm doit: ...}}()
Но не факт, что это подойдет.
Тут уже нужно непосредственно всю вставку смотреть.
3
MeowCoder
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 6
Завершенные тесты: 2
11.12.2016, 16:34  [ТС] #8
Ух, сколько возможностей извернуться) Смещение по коду помогло, спасибо!
0
HerrSchneider
0 / 0 / 0
Регистрация: 08.07.2017
Сообщений: 5
08.07.2017, 20:21 #9
а надо было как здесь написано!

цитирую:

Кроме того, есть ещё хитрый синтаксис для меток. Дело в том, что если наша вставка будет инлайниться в бинарнике несколько раз, то получится, что программа содержит несколько одинаковых меток. Что бы избежать этого к имени метки добавляется спец. последовательность "%=", которая внутри каждого блока asm заменяется на число, уникальное для всей программы.


C++
1
2
3
4
5
//бесконечный цикл
 
asm volatile (
        "Loop_%=: " "RJMP Loop_%="
);
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2017, 20:21
Привет! Вот еще темы с ответами:

Условный переход в ассемблерной вставке. - Visual C++
max: ...... cmp dl,al; jg max; error C2415: improper operand type не могу понять почему?

Получить разность двух меток в ассемблерной вставке - Visual C++
Приветствую! Хочу получить разность двух меток в ассемблерной вставке, то есть, по сути, расстояние между ними в байтах. Так...

Прерывания в ассемблерной вставке - Assembler
Здравствуйте. В программу, написанную на С++, нужно добавить ассемблерную вставку, поддерживающую прерывания (int 21h например). Каким...

Ошибки в ассемблерной вставке - C (СИ)
в 24 и 25 строке ругается, что недопустимое число операторов #include &quot;iostream&quot; #include &quot;windows.h&quot; #include &quot;stdlib.h&quot; ...


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

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

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