Сейчас я пишу загрузчик, который начинается в середине памяти, но после его завершения мне нужно перейти к основному приложению, подумал попробовать jmp 0x00
Однако мой чип не поддерживает jmp
как мне запустить главное приложение?
Хорошо взглянуть на RET
инструкция. Он возвращается в предыдущее место, поэтому вы можете попробовать:
push 0x00
push 0x00
ret
Это должно работать, потому что при входе в любую функцию вы нажимаете свое текущее местоположение, и RET
заставляет вас вернуться.
Насколько я помню, ATmege8 имеет 16-битную адресную строку, но если я не прав, вам может понадобиться больше push 0x00
я хотел бы использовать RJMP
:
Относительный переход по адресу внутри ПК — 2К +1 и ПК + 2К (слова). В
ассемблер, вместо относительных операндов используются метки.
Например:
entry:
rjmp reset
.org 512
reset:
rjmp foo
.org 3072
foo:
rjmp entry
Кстати, есть несколько других инструкций перехода (RJMP, IJMP, RCALL, ICALL, CALL, RET, RETI и т. Д.). См. это соответствующее обсуждение.
почему бы просто не использовать IJMP?
установите Z на 0x00 и используйте IJMP. может быть быстрее, чем 2xpush и ret
EOR R30, R30 ; clear ZL
EOR R31, R31 ; clear ZH
IJMP ; set PC to Z
должно быть 4 цикла и 3 слова инструкции (6 байт памяти программы)