|
|
  |
Абсолютный и относительный переход из макроса. |
|
|
|
Aug 28 2011, 09:40
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(Alt.F4 @ Aug 28 2011, 02:47)  Где можно прочесть про переходы из макросов? А вот хотя бы начиная со следующей строки. Самое главное: макросы это механизм генерации текста программы. Т.е. в результате работы макроассемблера первым делом происходит изменение именно текста программы, макровызов в исходном тексте заменяется на текст макрорасширения и этот текст далее скармливается ассемблеру для дальнейшей обработки. А уж какие там переходы, относительные или абсолютные, по-барабану. Сможете написать макрос так, чтобы в макрорасширении получить строчку с нужными буквами - будут у Вас переходы. Чаще проблемы возникают не собственно с командами перехода, а с метками. В некоторых недо-макро-ассемблерах есть проблема генерации уникальных локальных меток (в тексте макрорасширения), ведь если макро вызывается несколько раз нужно каждый раз сгенерировать разные метки, а у этих уродцев все метки глобальные, локальные отсутствуют как класс.
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Aug 28 2011, 15:31
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(Alt.F4 @ Aug 28 2011, 17:40)  Что имел ввиду товарищ GP1 во втором посте? Дык именно это. Приличный ассемблер при неоднократном использовании такого макроса (с абсолютной меткой внутри себя) должен выругаться на переопределение метки. Ниже ARV показал, как метки посредством $ превращаются в локальные, и дальше уж ассемблер сообразит. (могу предположить, что директивы local/global avrasm'ом тоже поддерживаются) Цитата(MiklPolikov @ Aug 28 2011, 13:49)  Например в MPLAB . Или я просто не знаю как там делать локальные метки в макросе. Поэтому вместо макроса с метками использую функцию, к которой перехожу командой CALL а возвращаюсь на место RETLW Лет сто не пользовался mpasm'ом, удивился, посмотрел - ничего не изменилось: hlpMPASMAsm.chm -> Directives -> local Код local_label MACRO local L1, L2 goto L1 L1 goto L2 L2 endm
ORG 0x0000
local_label ; метки будут развёрнуты в _1L1, _1L2 local_label ; метки будут развёрнуты в _2L1, _2L2 local_label ; метки будут развёрнуты в _3L1, _3L2 end
|
|
|
|
|
Aug 28 2011, 16:13
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
xemul, что-то я тогда не въезжаю, зачем они там закатили весь этот сыр-бор, ведь avrasm2 метки внутри макросов сразу делает локальными.  з.ы. Я сразу не понял о чем речь, думал о виде переходов из самого макроса. (Добавлено)Или товарищ все-таки вел речь именно о командах переходов, т.е. он имел ввиду, что в самом макросе можно прыгать только по относительным адресам (rjmp PC -> PC+k), а абсолютный переход недопустим (jmp PC -> k)? Просто он как-то выразился: "переходы внутри макроса, с абсолютными адресами недопустимы"
Сообщение отредактировал Alt.F4 - Aug 28 2011, 16:27
|
|
|
|
|
Aug 28 2011, 16:32
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(Alt.F4 @ Aug 28 2011, 20:13)  т.е. имелось ввиду, что перейти на метку, расположенную в макросе, из общей программы нельзя? Макрос - не более чем средство малой автоматизации. Он служит для _размножения_ некоего шаблона с заданными изменениями. Если Вы попытаетесь задать в макросе глобальную метку, то использовать такой макрос можно будет ровно 1 (один) раз. Чем думать, можно ли "перейти на метку, расположенную в макросе, из общей программы", лучше подумать, как организовать программу без таких из врысков. Цитата А avrasm2 метки внутри макросов сразу делает локальными. Логично, не правда ли? Цитата Просто он как-то выразился: "переходы внутри макроса, с абсолютными адресами недопустимы" См. выше.
|
|
|
|
|
Aug 28 2011, 16:57
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(Alt.F4 @ Aug 28 2011, 20:44)  А какая тогда проблема у человека, создавшего тот пост (учитывая, что avrasm сделал метки локальными в его макросе)? Уф-ф... jmp на метку byteOut из любой инкарнации макроса всегда будет выполняться по её адресу в первой инкарнации. Скомпилите и увидите. Если не увидите, прогоните этот кусок в симуляторе. Цитата з.ы. вчера много кода дописывал + уменьшал размер, выводя в подпрограмму общие действия нескольких макросов. Дак после всех махинаций стало где-то стэк срывать, прокручиваю варианты... Макросы не уменьшают, а увеличивают размер результирующего кода. Однотипные действия для экономии места обычно оформляют функциями.
|
|
|
|
|
Aug 28 2011, 17:24
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Цитата Уф-ф... jmp на метку byteOut из любой инкарнации макроса всегда будет выполняться по её адресу в первой инкарнации. А ё, теперь все понятно! Спасибо. Цитата Макросы не уменьшают, а увеличивают размер результирующего кода. Однотипные действия для экономии места обычно оформляют функциями. Дак я же и пишу, что часть действий из макросов, которые у них общие, выводил в подпрограмму (функцию).
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|