• ベストアンサー

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

-yoshi-の回答

  • ベストアンサー
  • -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でアセンブラ書くのは、これだから嫌~ン。

関連するQ&A

  • SHの命令の意味について

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

  • 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マイコン入門 堀桂太郎著 東京電機大学出版局発行

  • アセンブラに関する質問

    アセンブラに関する質問 現在アセンブラの勉強をしている者ですが2つ質問があります (1)以下のサイトの分岐とジャンプ命令の説明にPC+4という記述があるのですがこれはメモリアドレスを指しているのですか?そうだとしたら、4というのはデータ語長が4バイトだとだからという意味だと思うのですがPCというのは何なんでしょうか? R3000 URI:http://ja.wikipedia.org/wiki/R3000#.E5.91.BD.E4.BB.A4.E3.82.BB.E3.83.83.E3.83.88.E3.81.AE.E6.A6.82.E8.A6.81 (2)レジスタr1がレジスタr2の値より小さいとき処理Aと処理Bをさせる方法はどうしたらいいでしょうか?自分が思うに addi r2, r2, 100 ?←ループの始まりを知らせる命令を用意する 処理A 処理B addi r1, r1, 1 ble r1, r2, ?←ループの始まりに行く値をセットする という命令を書けばいいと思うのですが?の部分の書き方が分かりません。 使用できる無条件、条件分岐命令は以下のものが指定されています。 無条件分岐:j, jr, jal 条件分岐:beq, bne, blt, ble

  • SH902iでの自分のアドレス等の赤外線送信について

    SH902iで、赤外線受信の方法は判るのですが、 逆にこちらから相手に自分の番号、アドレスを赤外線送信する方法がわかりません。 マニュアルでも探したのですが見つけられませんでした。 よろしくお願いします。

  • 書籍の表記方法で特許は取れる?

    パソコン操作の書籍を執筆しています。 パソコンの操作は、 [ファイル]→[名前を付けて保存]、ダイアログの××をクリックして・・・、 などと特殊な表記をします。 逆に、表記によっては受講者が完全にやる気をなくしてしまうものも少なくありません。 わかりやすい表記の法則を登録したく思います。 http://www2.ipdl.jpo.go.jp で検索しましたが書籍についてはないようです。 著作権で守られる、という概念があるのかどうかわかりませんが、少なくともパソコンマニュアル制作には、わかりやすい表記の法則がありそれを徹底すれば、PC操作習得の効率が上がることは事実です。 実用新案ならOKでしょうか? 特許で守れないものでしょうか? よろしくお願いいたします。m(_ _)m

  • 8086アセンブラで、メモリ間のデータをストリング命令でブロック転送したい

    ソースが長めなので、簡潔に書きます。ご無礼の段、ご容赦ください。 【目的】PC-9801本体のCバス(汎用拡張スロット)に挿したサウンドボード上の ROM BIOSを読み出し、バイナリファイルに落としたい。既にエミュレータ用に実機からの 吸出しツールは存在するが、ソースが無いので、自作することにした。 その前段階としてアセンブラの修行も兼ねて、ROM BIOSの先頭3ワード(6バイト)を メモリ上のバッファにコピーし、比較して値の合致を確認したい。 将来的にはSCSI ROM BIOSの解析等を試みたい。 【方針】8086のストリング命令でダイレクトにメモリtoメモリでブロック転送を する。具体的にはrep movsbを用い、6バイトを転送する。 【備考】PC-9801-26K互換音源のROM BIOS(少なくとも先頭8バイト)は一意であり、 その並びは、0001h, 0000h, 00d2h である。例外はありません。 86音源でも同様で、下位互換性があることは、拙作ツール(OPNCHK.COM)にて確認済み。 なお、上記バイト列は、セグメントCC000h:オフセット2E00hから読み出し 可能である。 なお実行にあたり、所謂メモリマネージャの類(MELEMM.386等)は一切 組み込まない状態で行なう(EMSメモリマネージャ等との同居対応は将来の課題とします)。 【開発環境】PC-9801DA2(Cyrix Cx486DLC-25MHzに載せ換え; 13.6MB RAM; HA-55BS4 SCSIボード + 240MB SCSI HDD + SONY CPD-17SF9 CRT + NASM 2.06rc10 on NEC DOS 5.0A-H + Turbo Debugger v3.2 と、 秋葉で買ったジャンクFDに入ってたMASM ver 3.00; 予備機 VX41/RS21/EPSON 286VF/EPSON 486HX2/Xv13R16[K6-2 400MHz]/ AT互換機上のNekoIIエミュ/Cygwin上のnasmw.exe) 【参考書】PC-98、8086アセンブラ、テクニカルデータ、古雑誌等 定番本100冊ほど 【拙作コードの失敗点をご指南いただきたい。NASMコードですが、MASM/TASMでも構いません】 ; PC-9801-26K compatible Sound ROM BIOS Copy Program (i/o address 0188h) ; Programmed by OrzHacker666 ; Date 2009-07-13 for NASM 2.06rc10 [Bits 16] org 100h ; COM program section .text start: push es ; これを保存しないと、 push ds ; 画面がめちゃくちゃになる mov ax, 0cc00h ; Sound ROM セグメントアドレス mov es, ax mov ds, ax ; DS:SI -> ES:DI 無意味か? mov bx, 2e00h ; Sound ROM オフセットアドレス lea si, [es:bx] ; ES:BX がSound ROMの開始点 lea di, [ds:sbuff] ; sbuffは仮に確保したバッファ。 ; どこにあるかは、当たり前ですが、不明。そこら辺はCの変数宣言と同じですが。 mov cx, 8 ; とりあえず、アタマ8バイトをコピー cld rep movsb CompareWithOriginal: cmp word [es:bx+4], 00d2h ; これは通る。当たり前。 jne FailedCpyRom cmp word [ds:sbuff+4], 00d2h ; ここで失敗判定。なぜ? jne FailedCpyRom ; sbuffにes:bx~が正しく ; 転送されていないのか? SuccessCpyRom: ; これを拝めれば…。 pop ds pop es mov ah, 9 lea dx, [SUCCESSMsg] int 21h mov ax, 4c00h int 21h FailedCpyRom: ; 見飽きましたOrz pop ds pop es mov ah, 9 lea dx, [FAILEDMsg] int 21h mov ax, 4c00h int 21h section .data SUCCESSMsg: db 'Succeeded !!', 0dh, 0ah, '$' FAILEDMsg: db 'Failed(--;)', 0dh, 0ah, '$' section .bss sbuff: resb 8 ; Cで書くと、差し詰め unsigned char sbuff[8]; であろうか…。 識者の方、よろしくお願いいたします。気になって夜も眠れません。

  • 配列変数のポインターが勝手に変わる

    下記の2個のファイルを持つプログラムでインラインアセンブラのcall命令で配列変数のポインター(アドレス)が勝手に変わる現象をおしえてください。 但し、配列の最初のポインターのみが変わる。 開発環境はWin7(64bit)、VC++2010無償版です。 main.cpp int *disp; int data[3]; WinMain() { _asm mov disp,offset disp_top ・ ・ ・ メッセージループへ _asm{ disp_top://下記move()からcallされた時 lea eax,data//下記のmove()関数のeaxの値より16番地少ない lea ebx,data+4//下記のmove()関数のebxの値と同じ lea ecx,data+8//下記のmove()関数のecxの値と同じ ・ ・ ・ ret   } } move.cpp extern int *disp; extern int data[3]; void move() { _asm{ lea eax,data lea ebx,data+4 lea ecx,data+8 call disp   } }

  • アセンブラでのフロッピーディスク読み込み処理について

    アセンブラでのフロッピーディスク読み込み処理について IPLに興味を持ちCygwinのgas(ver2.19.51)とQEMUで開発を行っています。 フロッピーディスク読み込み処理で、以下の現象がおきて困っています。 esレジスタには0x0100を設定済み、bxレジスタに0x0e00を設定した状態で フロッピーディスクの1セクタ(0x200バイト)を呼び出すと、処理が終わった後のレジスタの 中身がおかしくなり、以降の処理ができなくなってしまいます。 本来ならbxレジスタは0x1000になるのが正しいと思うのですが、 添付図のようになってしまいます。(esレジスタ、csレジスタなども値がおかしい) 桁上がりがうまくいってないのかなと思うのですが、その原因が全くわかりません どなたかお分かりになる方よろしくお願いします。 ちなみに、 bxレジスタに0x0c00を設定 ⇒ 処理後0x0e00 となり問題なし bxレジスタに0x1e00を設定 ⇒ 処理後0x2000 となり問題なし(ちゃんと桁上りしている) 処理は問題ありませんでした。(ワケがわかりません) --------------------------------------------------- read_fd : #処理内容 読み出し movb $0x02, %ah #開始セクタ番号 movb $3, %cl #連続して処理するセクタ数 movb $1, %al #シリンダ番号(トラック番号) movb $0, %ch #ヘッド番号 movb $0, %dh #ドライブ番号 movb $0, %dl #フロッピーディスクから読み出したセクタの #メモリ書き込みアドレス[es:bx] esには0x0100設定済み movw $0xXXX, %bx ←ここのアドレス設定が問題! int $0x13 ret

  • メモリ上にプログラムをロードして実行したい!!

    C言語とマイコンで遊んでる者です。 タイトルの通りSDカードやCF等の記録媒体からマイコンのRAM上にプログラムをロードして実行させたいのですが方法がよく解りません。 説明しにくいのですが、PCで言うところのBIOSみたいな物を予めマイコンに書き込んでおいて、そのプログラムが外部のストレージの中に有る実行ファイルのようになってるプログラムデータをメモリ上にコピーして、処理をそのプログラムのエントリーポイントに受け渡すようなOSモドキみたいな物を作りたいのです。 アセンブラならLDとかMOVとかでメモリにコピー出来るかもしれませんが、C言語ではどのようにしてコピーするのでしょう? 仮にメモリ上にコピー出来てもmain()関数が重複してしまい呼び出す方法が解りません。 こちらもアセンブラならばプログラムカウンタをロードした位置にしてやればいいのでしょうけれど。 C言語ではできないでしょうか? マイコンはAVRかSH2Aで考えています。 何方かご教授願います。

  • サンク(Cの関数呼び出し)について その2

    1. Cの関数呼び出しは、アセンブリとして見るとどんなコードになっているのでしょうか? 2. http://oshiete1.goo.ne.jp/qa5750174.html すみませんが、上記質問「サンク方式について」の続きとして質問させて頂きます。 http://mentai.2ch.net/prog/kako/957/957341074.html cb=(WNDPROC)VirtualAlloc(NULL,10+5 , MEM_COMMIT, PAGE_EXECUTE_READWRITE); char *b=(char*)cb;            //コールバックゲートをこしらえる *b++= 0xC7; *b++= 0x05;       //MOV [adr],xxxx *((int *)b)++=(int)(&callbackSelf); //メモリアドレス *((int *)b)++=(int)this;       //オブジェクトアドレス *b++= 0xE9;             //jump long xxxx *((int *)b)= ((int)WndProcGate)-(4+(int)b);//ジャンプ先 リンク先の79レス目のコードを一部抜粋致しました。 おそらくMOV命令からオブジェクトアドレス代入までが実行環境の切替か調整を行ってる部分と思うのですが、これらの値を入れる事で結果どういう作用があるのでしょうか? また、この疑問に関する内容の書籍なりサイトがございましたら、そちらも紹介して頂けるとありがたいです。