2016-10-07 64 views
0

我正在使用Atmel Studio 6.2爲Atmega328p編寫一些彙編代碼。我在atmel編寫AVR程序集,但「調用」指令不起作用

但是,當我使用模擬器和分步執行程序時,子程序的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

在調試程序,你使用的命令「臺階」或命令「下一個?」 – fuz

+1

我這麼問是因爲通常調試器有無論是執行處理器執行的下一條指令的命令,還是執行直至程序中下一行代碼(例如'hello_world'完成執行後)的命令。 – fuz

+1

ooohh !!!我只是愚蠢的!是的,我很笨!當它打電話時,我應該點擊'進入'!!!!!它現在的作品T.T我不得不把我的頭撞到牆上的愚蠢!非常感謝:) :) :) – sosostris

回答

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. ret,彈出地址並返回
7.將值從r17(0)移至r16, r16值爲0

如果您一次運行該程序而不是一步一步地執行,則不會知道其中的差異。
希望這有助於

相關問題