Цитата(hakimulla @ Mar 29 2012, 10:26)

...в регистр Z нужно загружать адреса
меток, но как их получить в ассемблерной вставке?...эти адреса меток известны. Вопрос в синтаксисе. Как их
задать и как к ним обратиться внутри ассемблерной вставки?
я поддерживаю мысли тут высказанные:
1) гоу-ту на сях это зло. можно писать без него.
2) оптимизировать надо общий алгоритм а не портить жизнь оптимизатору(кстати он то включён правильно, с максимальным приоритетом по скорости выполнения???)
3) но если хочется на азме...
на азме это всего три команды. чтоб экономить и не брать каждый раз адрес - можно прибавлять только оффсеты к конкретному базовому адресу(хотя и его можно захардкодить или вычислить заранее).
Пример(рыба):
CODE
.equ OFFSET_TO_SUBROUTINE_1 = (Subroutine_1 - PointGetTempAddres)
.equ OFFSET_TO_SUBROUTINE_2 = (Subroutine_2 - PointGetTempAddres)
rcall PointGetTempAddres
PointGetTempAddres:
pop YH
pop YL
;-- YH:YL = address in FLASH "PointGetTempAddres"
movw ZL,YL
adiw ZL,OFFSET_TO_SUBROUTINE_2
;-- call Subroutine_2
icall
movw ZL,YL
adiw ZL,OFFSET_TO_SUBROUTINE_1
;-- call Subroutine_1
icall
;-- stop
Halt:
rjmp Halt
Subroutine_1:
ldi r16,100
ret
Subroutine_2:
ldi r16,200
ret
прау слов:
этому подходу - в обед сто лет. впервые приенялся в вирусной технологии на заре досика...
если адреса подпрограмм дальше чем 64 байта, то команды adiw надо заменить на пару add,adc
оффсеты и базовый адрес на рантайме не обязательно складывать. можно эту требуху хранить и в памяти, в таблице (к примеру).
Сообщение отредактировал IgorKossak - Aug 9 2012, 09:27
Причина редактирования: [codebox] для длинного кода