2016-10-07 3 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 

しかし、たとえこれが動作しない:私は次のようになります簡単なプログラムを書いたcall命令を試験するために

!それだけでmov R1, R0を実行します。 理由は何でしょうか? callがうまくいかないときはとても迷惑です!

+0

を定義する必要が
希望「次は?」 – fuz

+1

通常、デバッガが持っているので、私は聞いていますのよプロセッサによって実行される次の命令に進む命令と、プログラム内の次のコード行(たとえば、 'hello_world'の実行が完了した後)まで実行する命令の両方です。 – fuz

+1

ooohh !!!私はただばかです!はい、私はばかです!それが呼び出されたら、「ステップイン」をクリックしてください!!!!!それは今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を一般的な使用レジスタに使用しているため、デバッグにのみ使用しています。 3.負荷即値 "1" R18
4 2.負荷即値 "0" R17
へR16
から
1.負荷即値 "11"
ここでは、ステップの説明によってステップです。 hello_worldラベルを呼び出します。ので、R16の値が1
6 RETであり、R16とR18(1)からスタックに
5.移動値をアドレスをプッシュアドレスをポップし、そしてR16にR17(0)からバック
7.移動値になり、 r16の値が0

ステップバイステップではなく一度プログラムを実行すると、違いはわかりません。あなたは、コマンド「ステップ」またはコマンドを使用します。このヘルプ

関連する問題