2003-07-26 159118 [長年日記]

Windows CEでC++例外処理 (6)

eVC4のヘルプにアセンブラ周りの基本的な部分が載っていますね。関数呼び出しの時のレジスタの使い方など。

evc4help.chmのMicrosoft eMbedded Visual C++ Guide/Microprocessor Referenceあたりです。

Windows CEでC++例外処理 (7)

というわけで、まずはアセンブラで関数を書いてみるところから。

  CODE32
 
  AREA  |.text|, CODE, ARM
 
  EXPORT |get|
 
|get|  PROC
  mov       r0, #10
  mov       pc, lr
  ENDP
 
  END

とりあえずこれを、armasm.exeでobjにして、C++からこんな感じで呼び出すのには成功しました。

extern "C" int get();
 
printf("%d\n", get());

Windows CEでC++例外処理 (8)

C++のコードをアセンブラに落として調べているのですが、メンバ関数を呼び出すときには、r0にthisをセットしてから関数にジャンプすれば良い模様です。

なんだか例外処理と関係なくなって、ARMのアセンブラ入門みたいになっちゃってますね^^;;。

Windows CEでC++例外処理 (9)

catchブロックを呼び出すと、r0に継続用のアドレスが入れられるようです。そしてフレームポインタはr11なので、r11を元に戻してからr0に返されたアドレスに戻れば良さそうです。

ついでにunwind用の処理もr11を基準に生成されていて、lrをスタックにつんで終わったらその値をpcに戻しているので、unwindするときもr11を戻してからunwind用のアドレスをblで呼び出せば良さそうです。

[Q3] 2.9.2

Windows 9xで動かないという問題が一段楽したので、2.9.2を出しました。中身は今日のNightly Buildと同じです。