• 締切済み

アセンブラ、、タイマルーチン

LOOP0: MOV.W @DATA1,RO ;6ステート LOOP2: MOV.W @DATA2,R1   ;6 DEC.W #1,R1 ;2 BNE LOOP1 ;4 DEC.W #1,R0 ;2 BNE LOOP2 ;4 MOV.W #H'FFFF,R2 ;4 JSR @LIGHT ;6 JMP @LOOP0 ;4 上記のプログラムの実行にかかる時間を計算で求めるとどうなるでしょうか?? DATE1は H'FFFE00で DATE2は H'FFFE02です。ほかにも数値がいるでしょうか? ステートは自分で考えたので間違っているかもしれません(苦笑) 全然理解できていなくて困っています。教えてください!!

みんなの回答

  • seiuchi4
  • ベストアンサー率37% (71/189)
回答No.1

理論上の計算はループを展開して各ステート数を加算していき、 1/Clock(1ステート時間)を掛けてあげれば算出できます。 (ループの部分は実際に回る回数分を考慮) が、 1.ラベル「LOOP1」はどこでしょう? 2.JSR(サブルーチンジャンプ)先のルーチンのステート数は? 3.メモリモデルは?   (これにより@DATAなどのラベルを用いたデータのステートが変わる筈です) 4.CPUは何を使用するのでしょう?  CPUによっては先読みキャッシュ機能があり、実際のステートより  少ないステートで処理が行なわれます。 等など、前提条件によって結果が異なります。 単に学校の勉強等でしたら、LOOPの回数に気をつけて展開して 加算すれば求められるはずです。

hu2626hu
質問者

お礼

早速のご回答ありがとうございます!! LOOP1書き忘れました。すみません。 LOOP0: MOV.W @DATA1,RO    ;6ステート LOOP2: MOV.W @DATA2,R1   ;6 LOOP1:DEC.W #1,R1      ;2 BNE LOOP1       ;4 DEC.W #1,R0      ;2 BNE LOOP2       ;4 MOV.W #H'FFFF,R2   ;4 JSR @LIGHT      ;6 JMP @LOOP0      ;4 です。学校の授業ですので詳細は気にしなくていいと思います.サブルーチンは別で計算したのですがだめでしょうか?? 〔6+{6+(2+4)*R1+2+4}*R0+4+6+4〕*ステート時間  でよいでしょうか?いろいろ考えたのですがよくわかりません(苦笑)

関連するQ&A

  • アセンブラのタイマー割り込み

    ちょと長いですがプログラムおいときます 下のプログラムでは割り込みをスイッチで行うのですが スイッチを使わない割り込みをするにはタイマーがいいのではと聞きましたが 私にはわからなかったので教えていただきたいです どこをどう変えたら起動できるでしょうか? 使っているものはマイコン(R8C15)です 内容とか足らないのかもしれませんが何でも言ってください すみませんがよろしくお願いします .INCLUDE sfr_r815.inc ;プログラム部分 .SECTION PROGRAM, CODE .ORG 0D000h Start: LDC #0500h, isp LDINTB #VarVector JSR SetClock20MHz JSR InitPort JSR InitKeyInputIntr MOV.B Dummy, r0h FSET i Loop: BCLR p1_1 JSR Wait2s BSET p1_1 JSR Wait2s JMP Loop ;外部クロックに切り替えるサブルーチン SetClock20MHz: BSET prc0 BSET cm13 BSET cm15 BCLR cm05 BCLR cm16 BCLR cm17 BCLR cm06 NOP NOP NOP NOP BCLR ocd2 BCLR prc0 RTS ;ポートの初期化を行なうサブルーチン InitPort: MOV.B #00000110b,drr MOV.B #00000110b,p1 MOV.B #00000110b,pd1 RTS ;キー入力割り込みの初期化を行なうサブルーチン InitKeyInputIntr: BCLR ki0pl BSET ki0en MOV.B #01h, kupic RTS ;2秒待ちサブルーチン Wait2s: MOV.W #200, r1 Wait2s_1: JSR Wait10ms SBJNZ.W #1, r1, Wait2s_1 RTS ;10m秒待ちサブルーチン Wait10ms: PUSH.W r0 MOV.W #28571,r0 Wait10ms_1: SBJNZ.W #1,r0,Wait10ms_1 POP.W r0 RTS ;キー入力割り込み処理ルーチン KeyInput: Start1: MOV.B #10001001b,pd1 MOV.B #00000000b,p1 MOV.B #10111000b,pd3 MOV.B #00000000b,p3 Syoki01: MOV.W #2,r1 BSET p1_3 ;M BCLR p3_3 ;SDI Loop1: MOV.W #2,a1 GYOU: MOV.W #9,a0 CP00: BSET p3_4 ;CP=H BCLR p3_5 JSR wait1 BCLR p3_4 ;CP=L JSR wait1 BSET p3_4 ;CP=H BCLR p3_5 JSR wait1 BCLR p3_4 ;CP=L JSR wait1 SBJNZ.W #1,r1,CP00 BNOT p3_3 ;SDI MOV.W #2,r1 SBJNZ.W #1,a0,CP00 LOAD0: BSET p3_4 ;CP=H ;BSET p3_5 ;LOAD JSR wait1 BCLR p3_4 ;CP=L BCLR p1_0 ;DIO BSET p3_5 ;LOAD JSR wait1 BNOT p3_3 ;SDI SBJNZ.W #1,a1,GYOU MandDIO: BSET p1_0 ;DIO BNOT p1_3 ;M JMP Loop1 wait1: MOV.W #30,r2 wait001: SBJNZ.W #1,r2,wait001 RTS REIT ;その他の割り込み処理ルーチン NOTUSE: REIT ;データ(作業領域)部分 .SECTION WORK,DATA .ORG 0400h Dummy: .BLKB 1 ;可変ベクタテーブル .section VARIABLEVECTOR, ROMDATA .org 0F000h VarVector: .lword NOTUSE .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword KeyInput .lword NOTUSE .lword NOTUSE .lword NOTUSE .lword NOTUSE .lword NOTUSE ;リセットベクタ部分 .SECTION FIXVECTOR, ROMDATA .ORG 0FFFCh Reset: .LWORD Start | 0FF000000h .END

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

    下記のようなアセンブラのプログラムの勉強をしています。初心者。 (ベクターテーブルとかは省略してます) この状態であれば、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

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

    以下のような割り込みを用いないタイマーを使うプログラムを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***

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

  • マイコンキットで学ぶ/組み込みシステム入門

    【対象】 日経エレクトロニクス(2007.6.30発行) 16ビット・マイコン搭載ボード付き(組み込み速修キット) エミュレータ一体型 http://techon.nikkeibp.co.jp/embedded/academy/thats1.html http://techon.nikkeibp.co.jp/embedded/academy/guide1.pdf#search='NE... <マイコン> R5F21256SNFP <エミュレータチップ> HD64F2215U(H8Sファミリ/2215グループ) (このマイコンに特殊プログラムをインストールしてエミュレータ機能をもたせているのか?) <パソコンOS> Windows7(32bit版) Sw1(p1_7) Sw2(p1_3) LED1(p2_0) LED2(p2_1) 始めまして。アセンブリの学習を始めた初心者です。 皆さんに質問です。 現在「Sw1を押した時LED1が90%で点灯かつSw2を押した時LED2が80%で点灯する事」を課題として行っています。   私が入力した命令 .INCLUDE sfr_r825.inc .SECTION PROGRAM,CODE .ORG 0009000h Start: MOV.B #01110111b, pd1   p1_7、p1_3を入力ポートに設定 MOV.B #0FFh, pd2     p2_0,p2_1を出力ポートに設定 MOV.B #0FFh, p2      LED1,LED2消灯 Loop: BTST p1_7      Sw1がOnならZフラグに1、OFFなら0 JZ Sw1_On    Zフラグが1ならSw1_Onへ BTST p1_3      Sw2がOnならZフラグに1、OFFなら0 JZ Sw2_On    Zフラグが1ならSw2_Onへ JMP Loop Sw1_On: BCLR p2_0          LED1点灯 JSR Wait_LedOn01     BSET p2_0          LED消灯 JSR Wait_LedOff01 JMP Loop Sw2_On: BCLR p2_1           LED2点灯 JSR Wait_LedOn02 BSET p2_1           LED2消灯 JSR Wait_LedOff02 JMP Loop Wait_LedOn01: MOV.W #198,R0 WaitSub_LedOn01: SBJNZ.W #1,R0,WaitSub_LedOn01 RTS Wait_LedOff01: MOV.W #22,R0 WaitSub_LedOn02: SBJNZ.W #1,R0,WaitSub_LedOn02 RTS Wait_LedOn02: MOV.W #176,R0 WaitSub_LedOn03: SBJNZ.W #1,R0,WaitSub_LedOn03 RTS Wait_LedOff02: MOV.W #44,R0 WaitSub_LedOn04: SBJNZ.W #1,R0,WaitSub_LedOn04 RTS .SECTION FIXVECTOR,ROMDATA .ORG 0FFFCh Reset: .LWORD Start|0FF000000h .END という入力をしました。 しかし、Sw1,Sw2を同時に押した際、LED1のみの点灯となってしまいます。 試行錯誤で今まで行ってきましたが、現在止まってしまっております。 解決策など教えていただければと考えております。 回答の方、宜しくお願いいたします。

  • 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

  • VC2008のアセンブラ出力

    Visual C++ 2008 Express Editionで勉強をしています。 Cで簡単なプログラムを作り、そのアセンブラ出力を見ているのですが、下のアセンブラリストの###部のようなCの記述と関係ないコードが追加されます。この行を削除してアセンブルしても動作に問題ないように見えます。 このコードが追加される意味を教えて下さい。名前からセキュリティに関係しそうですが…… またプログラムによって追加される場合と、されない場合があります。何故でしょう? ご教示いただければ幸いです。 ----scanf.c #include <stdio.h> #include <stdlib.h> int main(void) { int i; char buf[256]; scanf("%s",buf); i = atoi(buf); printf("%d\n",i); return 0; } ----- -----scanf.asm ; Listing generated by Microsoft (R) Optimizing Compiler Version 15.00.30729.01 TITLE D:\vc_asm\scanf.c .686P .XMM include listing.inc .model flat INCLUDELIB LIBCMT INCLUDELIB OLDNAMES _DATA SEGMENT $SG3702 DB '%s', 00H ORG $+1 $SG3703 DB '%d', 0aH, 00H _DATA ENDS PUBLIC __$ArrayPad$ PUBLIC _main EXTRN _printf:PROC EXTRN _atoi:PROC EXTRN _scanf:PROC EXTRN ___security_cookie:DWORD EXTRN @__security_check_cookie@4:PROC ; Function compile flags: /Odtp _TEXT SEGMENT _buf$ = -264 ; size = 256 __$ArrayPad$ = -8 ; size = 4 _i$ = -4 ; size = 4 _main PROC ; Line 5 push ebp mov ebp, esp sub esp, 264; 00000108H mov eax, DWORD PTR ___security_cookie ###この行 xor eax, ebp ###この行 mov DWORD PTR __$ArrayPad$[ebp], eax ###この行 ; Line 8 lea eax, DWORD PTR _buf$[ebp]  (中略  Cで記述した内容の動作が記載) ; Line 11 xor eax, eax ; Line 12 mov ecx, DWORD PTR __$ArrayPad$[ebp] ###この行 xor ecx, ebp ###この行 call @__security_check_cookie@4 ###この行 mov esp, ebp pop ebp ret 0 _main ENDP _TEXT ENDS END -----

  • 組み込みアカデミー LEDを1個点灯のはずが2個点灯してしまいます

    組み込みアカデミー第1回 LEDを1個点灯のはずが2個点灯してしまいます。 対象は付録の「NE-R8C/25」です。動作確認プログラムのslos.hwsを実行するとLED1と2が交互・同時点灯を繰り返し、正常に動作しています。 ところが以下のプログラムをC:\WorkSpace\step01\step01\step01.a30として実行してもLEDが2個点灯してしまいます。 プログラム中 LED1点灯のところがMOV.B #11111110b,p2でもLED1と2同時に点灯してしまいます。 指定されたsfr_r825.incファイルはc:\WorkSpase\STEP01\STEP01以下にコピーしています。 .INCLUDE sfr_r825.inc ;SFR定義ファイルのインクルード .SECTION PROGRAM,CODE ;コードセクション .ORG 0009000h Start: MOV.B #11111111b,pd2 ;入出力ポートP2を出力ポートに設定 BCLR p2_0      ;LED1点灯  BSET p2_1      ;LED2消灯 Loop: JMP Loop .SECTION FIXVECTOR,ROMDATA .ORG 0FFFCh Reset: .LWORD Start|0FF000000h .END

  • 文字型変数を使って2進数表示すると、最上位ビットに1を立てると値に-記号が入ってしまいます

    VB6.0 WindowsXP 掲題の件ですが以下のコードを使って16進数を2進数表示にしていますが、最上位ビットに1を立てると値がおかしくなってしまいます。 Private Sub Form_Load() Dim dat(5) As Variant Dim i As Variant dat(0) = Right("0000000000000000" & Hex2Bin(Hex(&HFFFF)), 16) dat(1) = Right("0000000000000000" & Hex2Bin(Hex(&HFFFE)), 16) dat(2) = Right("0000000000000000" & Hex2Bin(Hex(&HFF00)), 16) dat(3) = Right("0000000000000000" & Hex2Bin(Hex(&HF000)), 16) dat(4) = Right("0000000000000000" & Hex2Bin(Hex(&HF0F0)), 16) dat(5) = Right("0000000000000000" & Hex2Bin(Hex(&H7FFF)), 16) For i = 0 To 5 Label1.Caption = Label1.Caption & dat(i) & vbCrLf Next Label2.Caption = "FFFF" & vbCrLf & "FFF0" & vbCrLf & "FF00" & vbCrLf & "F000" & vbCrLf & "F0F0" End Sub Public Function Hex2Bin(Hex) Dim Dec Dec = CInt("&H" + Hex) Hex2Bin = Dec2Bin(Dec) End Function Public Function Bin2Hex(Bin) Dim Dec Dec = Bin2Dec(Bin) Bin2Hex = Hex(Dec) End Function Public Function Dec2Bin(ByVal Dec) Do Dec2Bin = CStr(Dec Mod 2) & Dec2Bin Dec = Dec \ 2 Loop Until Dec = 0 End Function Public Function Bin2Dec(Bin) Dim i As Integer For i = 1 To Len(Bin) Bin2Dec = Bin2Dec * 2 + CInt(Mid(Bin, i, 1)) Next End Function なぜこうなってしまうのか、最上位に1を入れても1000000000000 のように表示させるにはどうしたらよいか教えていただきたいです。 よろしくお願いします。

専門家に質問してみよう