Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 6
1

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

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

Author24 — интернет-сервис помощи студентам
В 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.12.2016, 19:50
Ответы с готовыми решениями:

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

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

Получить разность двух меток в ассемблерной вставке
Приветствую! Хочу получить разность двух меток в ассемблерной вставке, то есть, по сути,...

Вызов функции WinAPI в ассемблерной вставке
Доброго времени суток! Необходимо получить значение времени вызовом функции WinAPI в ассемблерной...

8
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
10.12.2016, 22:46 2
Часто во встроенных ассемблерах допускается повторение меток при наличии модификаторов (типа, @@doit) или прагм.
Ещё возможен вариант при использовании синтаксиса masm32 - когда сама метка записывается @@, а обращение к ней или @@f или @@b в зависимости от того, где метка находится впереди или сзади.
1
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 6
11.12.2016, 11:38  [ТС] 3
У меня вроде masm, но символ собачки сразу вызывает error C2018: unknown character '0x40'
А можно поподробнее про прагмы?
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
11.12.2016, 12:03 4
Прагмы - это директивы (указания) компилятору. О них нужно поискать в справке к самому компилятору.
Пример прагмы, которая что-то разрешает компилировать
C
1
#pragma inline
Почитал https://www.cyberforum.ru/post5508094.html#a_02
Выходит, что нет локальных меток.

А вот смотрите, что нашлось в интернет
Метки в стиле Кнута еще никто не отменял,
они оптимальны для вставок,
пример на ассемблере:
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
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 6
11.12.2016, 13:17  [ТС] 5
Пишу в VS2013, про прагмы почитат тут https://msdn.microsoft.com/ru-... 1s805.aspx, но для моей ситуации там, кажется, ничего нет.

По поводу метода Кнута - увы
error C2400: inline assembler syntax error in 'opcode'; found 'constant'
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
11.12.2016, 14:26 6
Лучший ответ Сообщение было отмечено MeowCoder как решение

Решение

Подобрать смещение по асм коду jc $+15
2
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
11.12.2016, 16:12 7
Лучший ответ Сообщение было отмечено MeowCoder как решение

Решение

Как вариант:
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
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 6
11.12.2016, 16:34  [ТС] 8
Ух, сколько возможностей извернуться) Смещение по коду помогло, спасибо!
0
13 / 11 / 4
Регистрация: 08.07.2017
Сообщений: 103
08.07.2017, 20:21 9
а надо было как здесь написано!

цитирую:

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


C++
1
2
3
4
5
//бесконечный цикл
 
asm volatile (
        "Loop_%=: " "RJMP Loop_%="
);
0
08.07.2017, 20:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.07.2017, 20:21
Помогаю со студенческими работами здесь

Непонятки в ассемблерной вставке
В общем, все работает, только х2 не принимает значения с минусом, просто игнорирует минус + не...

Очищение памяти в ассемблерной вставке
/* Выделить из строки подстроку указанной длины, начиная с заданной позиции. */ ...

Сложение длинных чисел в ассемблерной вставке
У меня есть класс: class Big_int { UINT64* num; //массив разрядов числа size_t s, cap; ...

Как правильно вставлять диррективу .386 в ассемблерной вставке
привет)подскажите пожалуйста как правильно вставлять диррективу .386 в ассемблерной вставке?вот я...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru