簡體   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