• ベストアンサー

SHの命令の意味について

SHの、 MOV.L @(H'104:8,PC),R6 の意味がソフトウェアマニュアルをみてもよくわかりません。 ソフトウェアマニュアルをみると、PCに0x104を加えた値をR6にムーブ すると読めるのですが、PC(0x000017DC)に対してR6は0xFFFFE6B0に なります。 0x000017DC+0x104のメモリをみましたが、0xFFFFE6B0は見当たりません。 どなたかアドバイスお願いします。

noname#99417
noname#99417

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

  • ベストアンサー
  • R32C
  • ベストアンサー率39% (115/290)
回答No.2

SHはあんまり得意じゃないのですが、 SH2のソフトウエアマニュアルを見てみました。 計算方法としては、 現PC&0xfffffffc)+4 + 0x104 を指す中身をR6にムーブ  になり 実際には、 (0x17DC & 0xfffffffc)+4+(0x104) = 0x17E0+0x104 = 18E4 *(0x18E4)が 0xffffe6b0 になっているんじゃないでしょうか? 一応シミュレータで確認済みです。 #さらにSH3,4の場合はキャッシュがあるのですぐに反映されないよう #です。 以下蛇足: アセンブラおよびDisassemblerの仕様により、ディスプレースメントが スケーリングされている場合、されていない場合があります。 本来8bit長なわけで、最大0xff ですので超えています。 4倍がすでにされているので、そのまま加算します。 R社純正以外にもサードパーティ製のアセンブラの場合には考慮が必要な 場合があります。 riscプロセッサなので、命令長が固定のため、イミディエイト命令が 2byte長 4byte長は命令内にかけないので、 ROM上にデータを置いて、PC相対番地でレジスタに読み込む ようになっているようです。

noname#99417
質問者

お礼

もう一度メモリの内容をよくみてみます。 回答ありがとうございました。

その他の回答 (1)

  • kusa_mochi
  • ベストアンサー率76% (1599/2089)
回答No.1

自分はSHシリーズを使った事は無いが、アセンブラは齧った事があるのでちょっとだけ突っ込みを。 以下のマニュアルにざっと目を通してみた。  http://documentation.renesas.com/jpn/products/mpumcu/rjj09b0228_shprogram.pdf MOV.L @(disp:8,PC),Rnの命令の動作を見ると、質問者殿の説明と微妙に異なり  (disp×4+PC)→Rn と書かれている。 自分はSHのアセンブラを知らないので、ディスプレースメント(H'104)の意味に今一確信が持てないんだが、もしも想像通り16進でのイミディエイト値であるなら  ( 0x104 × 4 + PC ) → R6 となるべきだと思うのだが、どうだろう。 #マニュアルは良く読もうね

noname#99417
質問者

お礼

はい。よく読みます。 回答ありがとうございます。

関連するQ&A

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

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

  • 割り込みなしのタイマー

    以下のような割り込みを用いないタイマーを使うプログラムをH8マイコンで動かしたいのですが、上手くいきません・・・。表示を1秒間隔で切り替えていくものです。どこがよくないのでしょうか? MOV.L #FFFFD1,ER0      //PADDR MOV.B #FF,R1L //FF=11111111 MOV.B R1L,@ER0 //PADDR = FF MOV.L #FFFFD4,ER0      //PBDDR MOV.B #FF,R1L //FF=11111111 MOV.B R1L,@ER0 //PBDDR = FF MOV.L #FFFFD6,ER0      //PBDR MOV.B #5B,R1L //5B = "2" MOV.B R1L,@ER0 //PBDR = 5B MOV.L #FFFFD3,ER0      //PADR MOV.B #01,R1L //01 = 0KETA MOV.B R1L,@ER0 //PADR = 0KETA **128 MOV.L #FFFF64,ER2 //TCR0 MOV.B #83,R1H //83 = 1/8 MOV.B R1H,@ER2 //TCR0 = 1/8 MOV.L #FFFF6A,ER3      //GRA0 MOV.W #61A8,E1 //61A8 = 25000 MOV.W E1,@ER3 //GRA0 = 25000 MOV.W #3E8,E4 //3E8 = 1000 MOV.W #0,R4 // 0 MOV.B #F9,R5L // F9 MOV.L #FFFF67,ER0      //TSR0 MOV.L #FFFF60,ER6      //TSTR MOV.B #1,R5H MOV.B R5H,@ER6 //TSTR = 1 *158 MOV.B @ER0,R5H //TSR0の値 CMP.B R5L,R5H BNE FFF* MOV.B #F8,R5H //初期値に戻す MOV.B R5H,@ER0 INC.W #1,R4 CMP.W R4,E4 BNE FFF* MOV.B #0,R5H //ストップ MOV.B R5H,@ER6 MOV.L #FFFFD3,ER0      //PADR ADD.B R1L,R1L //表示桁の更新 MOV.B R1L,@ER0 BRA FFF**

  • タイマーを用いたプログラム

    H8のマイコンを用いて、7セグメントLEDを 1秒間隔で表示を切り替えるプログラムを作りたい のですが、いまいち上手くいきません。。。 タイマー割り込みは用いずに行いたいのですが、以下のプログラムでどこが間違っているのでしょうか?? MOV.L #FFFFD1,ER0 //PADDR MOV.L #FFFFD4,ER1 //PBDDR MOV.B #FF,R2L //FF=11111111 MOV.B R2L,@ER0 //PADDR = FF MOV.B R2L,@ER1 //PBDDR = FF MOV.L #FFFFD6,ER0 //PBDR MOV.L #FFFFD3,ER1 //PADR MOV.B #5B,R2L //5B = "2" MOV.B R2L,@ER0 //PBDR = 5B MOV.B #01,R2L //01 = 0KETA MOV.B R2L,@ER1 //PADR = 0KETA *** MOV.L #FFFF64,ER3 //TCR0 MOV.B #83,R2H //83 = 1/8 MOV.B R2H,@ER3 //TCR0 = 1/8 MOV.L #FFFF6A,ER3 //GRA0 MOV.L #61A8,ER4 //61A8 = 25000 MOV.L ER4,@ER3 //GRA0 = 25000 MOV.W #3E8,E3 //3E8 = 1000 MOV.W #0,R3 // 0 MOV.B #F9,R4L // F9 MOV.L #FFFF67,ER5 //TSR0 MOV.L #FFFF60,ER3 //TSTR MOV.B #1,R2H //TSTR = 1 ** MOV.B @ER5,R4H //TSR0の値 CMP.B R4L,R4H //比較 BNE FFF** //ループ MOB.B #F8,R4H //初期値に戻す MOV.B R4H,@ER5 // INC.W #1,R3 //ループ数 CMP.W R3,E3 //比較 BNE FFF** //ループ MOV.B #0,R2H //タイマーのストップ MOV.B R2H,@ER3 // ADD.B R2L,R2L //表示桁の更新 MOV.B R2L,@ER1 // BRA FFF***

  • 1~10まで足すプログラム

    H8のマイコンを使い始めた初心者です。 1~10まで足すプログラムを作りたいのですが、自分なりに以下のように組んでみました。合っているか分からないので、詳しい方いたら教えていただきです。 (アドレスは適当です。) FFF100 > MOV.L #200100,ER1 FFF106 > MOV.B #00,R0L FFF108 > MOV.B #0A,ROH FFF10A > INC.B #1,R0L FFF10C > CMP.B R0L,ROH FFF10E > BNE FFF10A FFF112 > MOV.B R0L,ER1

  • H8マイコン アセンブラ言語の乱数ルーチンについて

    H8マイコンでアセンブラ言語を使用しております。 アセンブラ言語で、ランダムに分岐するようにしたいのですが、乱数ルーチンをどのように作ればよいかわかりません。 下記は現在のメインプログラムです。ポート4の4の状態を調べ、真ならHYOJIに分岐するようにし、真でないならSTARTに戻るという風にしています。 START: MOV.B @P4DR,R0L MOV.B R0L,@SW_D MOV.B @SW_D,R0H BTST #4,R0H BEQ HYOJI JMP @START 5行目のBEQから乱数ルーチンにひとまず飛んで、そこからさらにランダムに選ばれた分岐に飛ぶというようにしたいです。 乱数ルーチンは現在時刻などから値を取得し、それからランダムな値を作ったりするのでしょうか? どなたかご協力お願いいたします。 ちなみに、下記は自分が参考にしている本です。 H8マイコン入門 堀桂太郎著 東京電機大学出版局発行

  • アセンブラの練習で困ってます

    下記のようなアセンブラのプログラムの勉強をしています。初心者。 (ベクターテーブルとかは省略してます) この状態であれば、tablに書いたデータどおりにLEDが順番に点灯します。 しかしtablの内容を書き換えると、点灯しなくなります。命令語の意味を 調べたりしたのですが、わかりません。どなたか理由を教えてください。 (例えば) 10000000 01000000 00100000 00010000 10000000 01000000 00100000 ・・・・ プログラム抜粋 reset: mov.l #stack,sp bsr initio begin: mov.l #tabl,er1 ; 点灯データ表 mov.w #14,r2 ; 点灯データ表のデータ数 loop: mov.b @er1+,r0l not.b r0l mov.b r0l,@p1dr bsr wait dec.w #1,r2 bne loop bra begin ; tabl: .data.b b'10000000 .data.b b'01000000 .data.b b'00100000 .data.b b'00010000 .data.b b'00001000 .data.b b'00000100 .data.b b'00000010 .data.b b'00000001 .data.b b'00000010 .data.b b'00000100 .data.b b'00001000 .data.b b'00010000 .data.b b'00100000 .data.b b'01000000 ; initio: mov.b #h'ff,r0l ; ポート1を出力に設定 mov.b r0l,@p1ddr rts ; wait: mov.l er0,@-sp mov.l #h'100000,er0 wait1: nop dec.l #1,er0 bne wait1 mov.l @sp+,er0 rts

  • 自分でアセンブラ言語を作れる?

    自分でアセンブラ言語を作れる? あるCPUにmov命令というのがありますが命令名をソフトウェアレベルで変えることは 出来るのでしょうか? (mov ax,1をmove ax,1にしたり) アセンブラはCPUが同じならどれも同じだと思っていたのですが プログラムを終了する時、windowsはint 21hなのにlinuxはint 0x80なので 疑問に思いました。

  • PLC 命令について

    PLCでの制御技術者の皆様へ 現在、PLCの技術者として走り出しましたが、命令用語がどうしても 判りません。マニュアルを見ても判らない。。。 申し訳ありませんが、以下の命令用語の意味を教えていただけませんでしょうか。宜しくお願いいたしします。 [WAND W219B HOF D500] [FLT D130 D141] [E* D141 E1.4 D145] [INT D145 D140] [E/ E23 E8.36 D125] [BIN K3X448 D502] [BCD D316 D332 ] [DIS D332 D330 K2 ] [PLS M868] [FMOV K0 K4F0 K100] [CJ P0] [DMOV K0 K4L2217] [DMOVP D344 D346] [DSFR R304 K2] [< K0 K2X804] [* R900 K9466 D902] [TO H18 H1E4 H102 K1] [FROM H18 H2E4 D122 K1] [BMOV SW80 D2000 K4] [K0 K1F721] [FIFR D184 R350] [FIFW D184 R340] [BCD D150 K2Y580] [FINSP D260 R320 D210] [FDELP D270 R300 D200] [D> K7M1420 K0] [D/ R16 D912 D920] [ENCO M1320 D250 K7] [SUM K3M2351 R350] [DECO R1 M250 K3]

  • 電気回路とソフトウェアの連携

    電気回路とソフトウェアの連携 以下のプログラムのフローチャートどういう風に書けばいいですか? 00H MOV C, #00H ;「c」の状態の初期化 01H MOV B, #00H ;「B」カウント値のリセット 02H OUT B ;出力ポートの状態を変更 03H IN A ;入力ポートの状態を取得 04H MOV D, A ;入力ポートの状態をDに退避 05H AND A, #02H ;2ビット目の情報を取得 06H JNZ L00H ;リセットボタンが押されている場合,0行目にジャンプ 07H MOV A, D ;入力ポートの状態をAにロード 08H AND A, #01H ;1ビット目の情報を取得 09H JNZ L0CH ;カウントボタンが押されている場合,C行目にジャンプ 0AH MOV C, #00H ;「C」の状態を0に設定 0BH JMP L02H ;2行目にジャンプ 0CH MOV A, C ;「C」の状態をAにロード 0DH CMP A, #00H ;「A」の状態は0か 0EH JNZ L02H ;ボタンが押されたままなので,2行目にジャンプ 0FH INC B ;Bの値を1カウントアップ 10H MOV C, ;「C」の状態を1に設定 11H JMP L02H ;2行目にジャンプ

  • この式が何を意味しているのかがわかりません。

    この式が何を意味しているのかがわかりません。 3つの点L(X1,y1)、M(x2,y2)、N(X3,y3)があります。 点Lと点Nを結ぶ直線を直線LNと呼び、傾きをA1、切片をB1とします。 A1=(y3-y1)/(x3-x1) B1=y1-(slope*x1) さらにA1の逆の傾きをA2とします。 A2=-(x3-x1)/(y3-y1) 点Mを通る傾きA2の直線の切片をB2とする。 B2=y2-(A2*x2) この時、下記の式は何を表しているか分かる人がいましたら教えてください。 N = (B2-B1)/(A1-A2)