繁体   English   中英

我在Atmel中编写AVR程序集,但是“调用”指令不起作用

[英]I'm writing AVR assembly in atmel, but “call” instruction doesn't work

我正在使用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不起作用时真令人讨厌!

.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

如果您一次而不是一步一步地运行程序,您将不知道它们之间的区别。
希望这个帮助

您必须定义堆栈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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM