A.7.2 関数のインタフェース

引数がすべてレジスタに乗るように(4個まで)引数の数を厳選してください。引数が多い場合は、構造体にしてポインタで渡してください。もし、構造体のポインタではなく、構造体そのものを受け渡すとレジスタに乗らない場合があります。引数がレジスタに乗れば、呼び出し、関数の出入り口の処理が簡単になります。またスタック領域も節約できます。なお、レジスタはR1〜R4が引数用です。

【使用方法】

関数fの引数が引数用レジスタ個数よりも4個多くあります。

改善前ソースコード

void call_func()
{
          func(1,2,3,4,5,6,7,8);
}

改善前アセンブリ展開コード

_call_func:
            SUB #04H,R0
            MOV.L #08070605H,[R0]
            MOV.L #00000004H,R4
            MOV.L #00000003H,R3
            MOV.L #00000002H,R2
            MOV.L #00000001H,R1
            BSR _func
            ADD #04H,R0
            RTS

改善後ソースコード

struct str{
         char a;
         char b;
         char c;
         char d;
         char e;
         char f;
         char g;
         char h;
};
struct str arg = {1,2,3,4,5,6,7,8};
 
void call_func()
{
          func(&arg);
}

改善後アセンブリ展開コード

_call_func:
         MOV.L #arg,R1
         BRA _func