ColdFire でアセンブラ (1) - 長くなりそうだ [ColdFire (ColdeFire) V1]
ColdFireのコンパイラは、Cのソース・コードの中にアセンブラを記述することができます。 どんな機能があるのか、しらべてみました。
単純な関数
まずは、簡単な例から考えます。
dword func1(dword a, dword b) { dword x; __asm { move a,d0 // D0 = a add b,d0 // D0 += b move d0,x // x = D0 } return x; }
二つの引数の和を返す関数です。 もちろん、これをわざわざアセンブラで記述する意味はありません。 これをコンパイルすると、こんなコードになります。
0x00000000 _func1: ; func1: 0x00000000 0x4FEFFFF4 lea -12(a7),a7 0x00000004 0x2E80 move.l d0,(a7) 0x00000006 0x2F410004 move.l d1,4(a7) ; ; 22: move a,d0 // D0 = a 0x0000000A 0x2017 move.l (a7),d0 ; ; 23: add b,d0 // D0 += b 0x0000000C 0xD0AF0004 add.l 4(a7),d0 ; ; 24: move d0,x // x = D0 ; 25: } 0x00000010 0x2F400008 move.l d0,8(a7) ; ; 26: return x; 0x00000014 0x222F0008 move.l 8(a7),d1 0x00000018 0x2001 move.l d1,d0 ; ; 27: } 0x0000001A 0x4FEF000C lea 12(a7),a7 0x0000001E 0x4E75 rts
一部コメント行を削除しました。 引数aとbに 局所変数xを加えた12バイト分の スタック・エリアを確保しています。
すべての操作がスタック・エリアを使った受け渡しになっているので、 処理が煩雑になっています。 わかりやすいと言えばわかりやすいのですけど。
コメント 0