みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

SH3のアセンブラの表記について

 SH3のマニュアルでは、MOVの表記は、MOV.L@(disp,PC),Rnになっています。
ところが、エミュレータの逆アセンブラの表記は、MOV.L@(xxxx:8,PC),Rn
となっています。xxxxのアドレスから、どのアドレスの値を持ってくるの
でしょうか????

投稿日時 - 2001-03-01 10:49:09

QNo.46263

暇なときに回答ください

質問者が選んだベストアンサー

>逆アセンブラで、1000番地にMOV.L@(0018:8,PC),R15と表記されているとき
>これを実行後、R15の値は、PC+001Cつまり101Cから4バイトがR15に
>入ってしまうのですが、どういう計算なのでしょうか?。
確たる自信をもってはいませんがSHは完全RISCパイプラインアーキテクチャ
のため、1000番地に上記命令があり、これを「実行している」とき既にPCは
2個先の命令のデコードの所にあり1004になっているからではないですか?
1004+0018->101Cということです。
ちなみにSHの遅延分岐は御存知ですか?例えば
MOV#0,R0
BRALABEL
MOV#1,R0
LABEL:
ADD#1,R0
<- この時点でR0は2になる。
これもBRA命令の「実行の時点」でPCは+4されていると考えられない
でしょうか?
# SHでアセンブラ書くのは、これだから嫌~ン。

投稿日時 - 2001-03-01 13:28:37

ANo.2

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

エミュレータおよびアセンブラの表記によって違いは在るかも知れませんが、
'mov.l @(disp,PC),Rn'は(PC & fffffffc) + disp * 4で求まったアドレスの
内容をRnに入れることです。ここでdispはSHの命令長の関係上8ビット値になり
ます(詳しくは日立のページあたりからデータブックを取ってきてみてください)。
大抵のアセンブラの例を挙げると(インデントが入らないので見づらいですが)、
mov.l@(INDEX,pc),r0
mov.l@r0,r1
- 省略 -
INDEX:
.longTABLE
TABLE:
.long1
とすると、R0にはTABLEのアドレスが入り、R1には1が入ります。
アセンブラが現在PC値からINDEXの相対アドレスを計算してくれるのでその辺は
気にしなくていいです。当然8ビットで届かなければアセンブルエラーになりますが。

投稿日時 - 2001-03-01 11:36:51

補足

逆アセンブラで、1000番地にMOV.L@(0018:8,PC),R15と表記されているとき
これを実行後、R15の値は、PC+001Cつまり101Cから4バイトがR15に
入ってしまうのですが、どういう計算なのでしょうか?。

投稿日時 - 2001-03-01 12:52:14

あなたにオススメの質問