[英]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.