我正在atmel写AVR程序集,但“call”指令不起作用

问题描述 投票:0回答:2

我正在使用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无效时,它太烦人了!

assembly avr atmega atmel
2个回答
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

如果您一次运行该程序而不是一步一步,您将不会知道其中的差异。 希望这有帮助


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
© www.soinside.com 2019 - 2024. All rights reserved.