So-net無料ブログ作成
English Version

独自言語 picle のコンパイラ化(その1) [PIC]

 インタープリタができたのでコンパイラ化するためにローカル変数領域の確保処理に関連する LNK,ULNK命令について確認してみました。
 普通にC言語を使ってアプリケーション作成している分にはあまり意識しない部分です。強いて言えばソースがまったく正しいとしか見えずコンパイラのバグなのか??のような煮詰まった状態の時に必要な情報かもしれませんw
 PIC24ファミリのリファレンスマニュアルを見るとスタックフレームポインタに関してはdsPIC30Fのプログラマリファレンスを見るように書かれており、インストラクション 一覧を見てもどういう動作なのか説明がありません。^^;

 プログラマリファレンスを見ると図付きで説明が書かれていますが、どういう動きをするのか具体的に書いてもらったほうが理解しやすいのにと思ってしまいます。
 結論としては説明の図をアセンブル言語的に表現すると次のようになります。

LNK #lit14
 ↓
push W14
mov W15,W14
add #lit14,W15

ULNK
 ↓
mov W14,W15
pop W14

 参考にpicleインタープリタ内のPutStr()関数のディスアセンブルは下記のようになります。
 ローカル変数よりも引数の方が後ろにアサインされるんですね。(コンパイラにもよるでしょうが)
 また、SUBの結果をスタックポインタが示す未使用部分に捨てているのが面白い。
 
!char *PutStr( char *str )
!{
0x1C66: LNK #0x4
0x1C68: MOV W0, [W14+2]
!   char c;
!   while( *str != '\0' ) {
0x1C6A: BRA 0x1C82
0x1C82: MOV [W14+2], W4
0x1C84: MOV.B [W4], W4
0x1C86: SUB.B W4, #0x0, [W15]
0x1C88: BRA NZ, 0x1C6C
0x1C8A: BRA 0x1C8E
!       putchar( ( c = *str++ ) );
0x1C6C: MOV [W14+2], W4
0x1C6E: MOV.B [W4], [W14]
0x1C70: MOV.B [W14], W4
0x1C72: MOV [W14+2], W5
0x1C74: INC W5, W5
0x1C76: MOV W5, [W14+2]
0x1C78: MOV.B W4, W0
0x1C7A: RCALL SndChar
!       if( c == CHAR_ENTER_KEY ) {
0x1C7C: MOV.B [W14], W4
0x1C7E: SUB.B W4, #0xD, [W15]
0x1C80: BRA Z, 0x1C8C
!           break;
0x1C8C: NOP
!       }
!   }
!   return( str );
0x1C8E: MOV [W14+2], W4
!}
0x1C90: MOV W4, W0
0x1C92: ULNK
0x1C94: RETURN



[ 前へ ] 連載記事 [ 次へ ]
nice!(0)  コメント(0)  トラックバック(6) 
共通テーマ:趣味・カルチャー

nice! 0

コメント 0

コメントを書く

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

トラックバック 6