ATmega8不支持JMP指令
ATmega8 doesn't support JMP instruction
现在我正在编写从内存中间启动的引导加载程序,但是完成后我需要转到主应用程序,想尝试jmp 0x00
,但是我的芯片不支持jmp
,我应该如何启动主应用程序?
我会使用RJMP
:
相对跳转到 PC 中的地址 - 2K +1 和 PC + 2K(单词)。在 汇编程序,使用标签代替相对操作数。
例如:
entry:
rjmp reset
.org 512
reset:
rjmp foo
.org 3072
foo:
rjmp entry
顺便说一下,还有其他几个跳转指令(RJMP,IJMP,RCALL,ICALL,CALL,RET,RETI等)。请参阅此相关讨论。
好吧,
看看RET
指令。它将返回到上一个位置,因此您可以尝试:
push 0x00
push 0x00
ret
这应该有效,因为在进入任何功能时,您都会推送当前位置,RET
会让您返回。
据我所知,ATmege8 有 16 位地址行,但如果我说的不对,您可能需要更多push 0x00
为什么不简单地使用IJMP?
将 Z 设置为0x00并使用 IJMP。 可能比 2xpush 和 ret 快
EOR R30, R30 ; clear ZL
EOR R31, R31 ; clear ZH
IJMP ; set PC to Z
应为 4 个周期和 3 个指令字(6 字节程序存储器)
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- C++:对不存在的命名空间使用命名空间指令
- 函数名是c中该函数的第一条指令的地址吗
- 错误:无效的预处理指令 #i 的意思是 #if?
- 组装指令中乘法的下部和上部是什么
- OpenMP 与有序和关键指令并行
- C++中的移动分配出现问题.非法指令: 4.
- 嵌套命名空间的"using"指令,但需要命名内部命名空间
- C++CMake编译指令与
- 使用宏扩展的泛型:为什么指令缓存使用不当?
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- AVX 指令中寄存器和指针之间的客观差异
- while 循环 c++ 中的非法指令
- 如何在编译时定义C++预处理器指令的值?
- 存储指令是否会阻止缓存未命中的后续指令?
- 保证编译器指令在C++中重新排序
- x86 - 为什么编译器在下一条指令中插入看似毫无意义的JMP?
- 如何强制 GCC 使用 jmp 指令而不是 ret?
- ATmega8不支持JMP指令