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

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

10.12.2016, 19:50. Показов 4609. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.12.2016, 19:50
Ответы с готовыми решениями:

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

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

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

8
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8663 / 4500 / 1670
Регистрация: 01.02.2015
Сообщений: 13,922
Записей в блоге: 13
10.12.2016, 22:46
Часто во встроенных ассемблерах допускается повторение меток при наличии модификаторов (типа, @@doit) или прагм.
Ещё возможен вариант при использовании синтаксиса masm32 - когда сама метка записывается @@, а обращение к ней или @@f или @@b в зависимости от того, где метка находится впереди или сзади.
1
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 6
11.12.2016, 11:38  [ТС]
У меня вроде masm, но символ собачки сразу вызывает error C2018: unknown character '0x40'
А можно поподробнее про прагмы?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8663 / 4500 / 1670
Регистрация: 01.02.2015
Сообщений: 13,922
Записей в блоге: 13
11.12.2016, 12:03
Прагмы - это директивы (указания) компилятору. О них нужно поискать в справке к самому компилятору.
Пример прагмы, которая что-то разрешает компилировать
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  [ТС]
Пишу в VS2013, про прагмы почитат тут https://msdn.microsoft.com/ru-... 1s805.aspx, но для моей ситуации там, кажется, ничего нет.

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

Решение

Подобрать смещение по асм коду jc $+15
2
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
11.12.2016, 16:12
Лучший ответ Сообщение было отмечено 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  [ТС]
Ух, сколько возможностей извернуться) Смещение по коду помогло, спасибо!
0
13 / 11 / 4
Регистрация: 08.07.2017
Сообщений: 103
08.07.2017, 20:21
а надо было как здесь написано!

цитирую:

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


C++
1
2
3
4
5
//бесконечный цикл
 
asm volatile (
        "Loop_%=: " "RJMP Loop_%="
);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.07.2017, 20:21
Помогаю со студенческими работами здесь

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

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

Очищение памяти в ассемблерной вставке
/* Выделить из строки подстроку указанной длины, начиная с заданной позиции. */ #include &lt;stdio.h&gt; #include...

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru