• ベストアンサー

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

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

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

  • ベストアンサー
  • -yoshi-
  • ベストアンサー率35% (23/65)
回答No.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 BRA LABEL MOV #1,R0 LABEL: ADD #1,R0 <- この時点でR0は2になる。 これもBRA命令の「実行の時点」でPCは+4されていると考えられない でしょうか? # SHでアセンブラ書くのは、これだから嫌~ン。

その他の回答 (1)

  • -yoshi-
  • ベストアンサー率35% (23/65)
回答No.1

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

sekinegoobro
質問者

補足

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

関連するQ&A