[H8-ML(4417)] Re: 【オフトピック】SHのPRって?
From: hamayan <hamayan@xxxxxxxxxxxxxxxx>
Date: 2004年02月06日(金)21時53分47秒
hamayan です。

廣田> jsrを実行した後、戻り先をスタックに積むより処理が速くなると言っても
廣田> 飛び先のサブルーチンがさらにjsrをネスティングするためには結局、PRを
廣田> どこかに保存しなければなりません。

必ずしもサブルーチンの中から、またサブルーチンを呼ぶとは限らないからでは?
簡単な関数ならインライン展開されてしまう事が多いです。


廣田> おそらく、Cコンパイラも、ある関数を汎用的に作ろうとするなら、結局prを
廣田> スタック上に積んだり、戻したりする処理をつけるでしょう。

コンパイラは何でしょう?
HEWでの結果です。こんなどうでも良い関数をやらせてみました。

int prociduer(int a, int b);

int kotae;

void main(void)
{
    kotae = prociduer(1, 2);
}

int prociduer(int a, int b)
{
    return a + b;
}

アセンブル結果は、
_main:                           ; function: main
                                 ; frame size=4
          STS.L       PR,@-R15
          MOV         #1,R4      ; H'00000001
          BSR         _prociduer
          MOV         #2,R5      ; H'00000002
          MOV.L       L12+2,R6   ; _kotae
          LDS.L       @R15+,PR
          RTS
          MOV.L       R0,@R6
_prociduer:                      ; function: prociduer
                                 ; frame size=0
          ADD         R5,R4
          RTS
          MOV         R4,R0
L12:
          .RES.W      1
          .DATA.L     _kotae
          .SECTION    B,DATA,ALIGN=4 
_kotae:                          ; static: kotae
          .RES.L      1
          .END
でした。
関数prociduerは、関数の内部で完結していると判断できるので、この様な場合
HEWはSPEEDオプションを付けると、徹底的に最適化します。

スタックはメモリ上に詰まれますが、もしかして8bitサイズで、低速なメモリ
かもしれないので、あてには出来なかったのでは?
スレッド概略
[4416(R)](起点)
 └[表示中]
   └[4418(1)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]