ColdFire でアセンブラ (3) - ミスアセンブル? [ColdFire (ColdeFire) V1]
アセンブル・ミス?発見
CodeWarrior V6.1 でアセンブラ・プログラムを書いていて不可解な現象を見つけました。
__asm dword func(dword a, dword b, dword c, dword d) { fralloc mulu b,a // a = a * b mulu d,c // c = c * d move a,d0 // D0 = a * b add c,d0 // D0 = a * b + c * d frfree rts }
よくある積和演算関数です。 わざわざアセンブラで書くこともありませんが、例題として準備していたものです。 ところが、コンパイル-ディスアセンブルして、ビックリ!
; 4: __asm dword func(dword a, dword b, dword c, dword d) { ; 4: { ; 5: fralloc 0x00000000 _func: ; func: 0x00000000 0x4E560000 link a6,#0 ; ; 6: mulu b,a // a = a * b 0x00000004 0x4C010000 mulu.l d1,d0 ; ; 7: mulu d,c // c = c * d 0x00000008 0x6C2E bge.s *+48 ; 0x00000038 0x0000000A 0x00000008 ori.b #0x8,d0 ; '.' ; ; 8: move a,d0 // D0 = a * b 0x0000000E 0x2000 move.l d0,d0 ; ; 9: add c,d0 // D0 = a * b + c * d 0x00000010 0xD082 add.l d2,d0 ; ; 10: frfree 0x00000012 0x4E5E unlk a6 ; ; 11: rts 0x00000014 0x4E75 rts 0x00000016 0x51FC trapf
二つ目のmuluは、どこに行っちゃったの? bgeって、何? もちろん、この関数はうまく動きませんし、bgeで あらぬ所に飛んでいくのでデバッガでも追いきれません。
あるべき姿
本来、この部分は、"MULU.L 8(A7),D2"または"MULU.L 8(A6),D2"に変換されます。 前者なら "0x4C2F 0x2000 0x0008" が、 後者なら "0x4C2E 0x2000 0x0008" が、 生成されます。 生成されたコードから考えて、後者のコードを間違えたように見えますね。
コメント 0