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

A 回答 (2件)

>逆アセンブラで、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でアセンブラ書くのは、これだから嫌~ン。
    • good
    • 0

エミュレータおよびアセンブラの表記によって違いは在るかも知れませんが、


'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ビットで届かなければアセンブルエラーになりますが。

この回答への補足

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

補足日時:2001/03/01 12:52
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

今、見られている記事はコレ!

おしトピ編集部からのゆる~い質問を出題中

お題をもっとみる

このQ&Aを見た人が検索しているワード


このカテゴリの人気Q&Aランキング

おすすめ情報

カテゴリ