我正在使用Atmel Studio 6.2为Atmega328p编写一些汇编代码。
但是,当我使用模拟器并逐步执行程序时,子程序的call
指令不起作用。它完全忽略了call
指令并继续下一行。
为了测试call
指令,我编写了一个简单的程序,如下所示:
.include "m328pdef.inc"
ldi R16, 11
call hello_world
mov R1, R0
nop
hello_world:
mov R0, R16
ret
但即使这样也行不通!它继续执行mov R1, R0
。
可能是什么原因?当call
不起作用时,这太烦人了!
答案 0 :(得分:0)
.include "m328pdef.inc"
ldi r16,11
ldi r17,0
ldi r18,1
rcall hello_world
mov r16,r17
nop
hello world:
mov r16,r18
ret
我使用的是r16,r17和r18因为它的一般用途寄存器,只能用于调试
这里是一步一步的解释:
1.立即将值“11”加载到r16
2.将立即值“0”加载到r17
3.将立即值“1”加载到r18
4.调用hello_world标签。将地址推入堆栈
5.将值从r18(1)移动到r16,因此r16值为1
6.退回,弹出地址,然后返回
7.将值从r17(0)移动到r16,r16值为0
如果你一次性运行程序而不是一步一步,你就不会知道它们之间的区别 希望这个帮助
答案 1 :(得分:0)
你必须定义堆栈 http://www.avr-tutorials.com/assembly/writing-assembly-subroutines-avr-microcontroller
;Initialize the microcontroller stack pointer
LDI R16, low(RAMEND)
OUT SPL, R16
LDI R16, high(RAMEND)
OUT SPH, R16