0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 6
|
||||||
1 | ||||||
Метки в макросах в ассемблерной вставке10.12.2016, 19:50. Показов 4125. Ответов 8
Метки нет (Все метки)
В C++ написан макрос с ассемблерной вставкой, который содержит в себе метку "doit" и команду перехода на неё:
error C2412: 'doit' : case-insensitive label redefined Насколько я понял, это из-за того, что фрагмент кода дублируется, и метка вместе с ним. Можно ли как-нибудь скрыть эту метку, чтобы при каждом вызове макроса кусок кода видел только свою метку? Оформить это в виде макроса - обязательное условие по заданию, так что процедуры вопрос не решают. Вместо макроса #define пытался сделать ассемблерный macro, но он отвергается inline-asm'ом.
0
|
10.12.2016, 19:50 | |
Ответы с готовыми решениями:
8
Вызов функции в ассемблерной вставке C++. Условный переход в ассемблерной вставке. Получить разность двух меток в ассемблерной вставке Вызов функции WinAPI в ассемблерной вставке |
Модератор
|
|
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
|
Модератор
|
|||||||||||
11.12.2016, 12:03 | 4 | ||||||||||
Прагмы - это директивы (указания) компилятору. О них нужно поискать в справке к самому компилятору.
Пример прагмы, которая что-то разрешает компилировать
Выходит, что нет локальных меток. А вот смотрите, что нашлось в интернет
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
|
Модератор
|
|
11.12.2016, 14:26 | 6 |
Сообщение было отмечено MeowCoder как решение
Решение
Подобрать смещение по асм коду
jc $+15
2
|
Неэпический
|
|||||||||||
11.12.2016, 16:12 | 7 | ||||||||||
Сообщение было отмечено MeowCoder как решение
Решение
Как вариант:
Тут уже нужно непосредственно всю вставку смотреть.
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 заменяется на число, уникальное для всей программы.
0
|
08.07.2017, 20:21 | |
08.07.2017, 20:21 | |
Помогаю со студенческими работами здесь
9
Непонятки в ассемблерной вставке Очищение памяти в ассемблерной вставке Сложение длинных чисел в ассемблерной вставке Как правильно вставлять диррективу .386 в ассемблерной вставке Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |