SSブログ

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" が、 生成されます。 生成されたコードから考えて、後者のコードを間違えたように見えますね。


nice!(0)  コメント(0)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。