To Begin With http://www.grenvillecollege.co.uk/ pay day loans {}Just .
* OSECPUの仮想CPUの命令セット
-(by [[K]], 2013.05.07)

* リビジョン 0008
-基本的にはリビジョン0005や0006と同じです。
--レジスタの使い方が変更になっています。
-アセンブラ表記を追加しました。
//-定数レジスタの概念がとりあえずなくなりました。今後復活させるとしても、R38以降にする予定です。
** ver.0.36
 NOP();                                                  00                           1バイト命令 (no-operation)
 LB(im8, im32);                                          01 [im8] [im32]              6バイト命令 (label)
 LIMM(Rxx, im32);            %(Rxx = im32);              02 [Rxx] [im32]              6バイト命令 (load-immediate)
 PLIMM(Pxx, im32);           %(Pxx = im32);              03 [Pxx] [im32]              6バイト命令 (pointer-load-immediate)
 CND(Rxx);                                               04 [Rxx]                     2バイトプリフィクス (condition)
 
 LMEM(Rxx, ty32, Pxx); mc                                08 [Rxx] [ty32] [Pxx] mc     (8+4n)バイト命令 (load-memory, load-member)
 SMEM(Rxx, ty32, Pxx); mc                                09 [Rxx] [ty32] [Pxx] mc     (8+4n)バイト命令 (store-memory, store-member)
 
 PADD(Pxx, ty32, Pxx, Rxx);                              0E [Pxx] [ty32] [Pxx] [Rxx]  8バイト命令 (pointer-add)
 PDIF(Rxx, ty32, Pxx, Pxx);                              0F [Rxx] [ty32] [Pxx] [Pxx]  8バイト命令 (pointer-diff)
 CP(Rxx, Rxx);               %(Rxx = Rxx);               10 [Rxx] [Rxx] FF            4バイト命令 (copy)
 OR(Rxx, Rxx, Rxx);          %(Rxx = Rxx |  Rxx);        10 [Rxx] [Rxx] [Rxx]         4バイト命令 (or)
 XOR(Rxx, Rxx, Rxx);         %(Rxx = Rxx ^  Rxx);        11 [Rxx] [Rxx] [Rxx]         4バイト命令 (xor)
 AND(Rxx, Rxx, Rxx);         %(Rxx = Rxx &  Rxx);        12 [Rxx] [Rxx] [Rxx]         4バイト命令 (and)
 
 ADD(Rxx, Rxx, Rxx);         %(Rxx = Rxx +  Rxx);        14 [Rxx] [Rxx] [Rxx]         4バイト命令 (add)
 SUB(Rxx, Rxx, Rxx);         %(Rxx = Rxx -  Rxx);        15 [Rxx] [Rxx] [Rxx]         4バイト命令 (subtract)
 MUL(Rxx, Rxx, Rxx);         %(Rxx = Rxx *  Rxx);        16 [Rxx] [Rxx] [Rxx]         4バイト命令 (multiply)
 
 SHL(Rxx, Rxx, Rxx);         %(Rxx = Rxx << Rxx);        18 [Rxx] [Rxx] [Rxx]         4バイト命令 (shift-left)
 SAR(Rxx, Rxx, Rxx);         %(Rxx = Rxx >> Rxx);        19 [Rxx] [Rxx] [Rxx]         4バイト命令 (shift-arithmetic-right)
                                                         1A [Rxx] [Rxx] [Rxx]         4バイト命令
                                                         1B [Rxx] [Rxx] [Rxx]         4バイト命令
                                                         1C [Pxx] [Pxx]               3バイト命令
                                                         1D [Pxx] [Pxx]               3バイト命令
 PCP(Pxx, Pxx);              %(Pxx = Pxx);               1E [Pxx] [Pxx]               3バイト命令 (pointer-copy)
                                                         1F [Pxx] [ty32] [Pxx] [ty32] 11バイト命令
 CMPE(Rxx, Rxx, Rxx);        %(Rxx = Rxx == Rxx);        20 [Rxx] [Rxx] [Rxx]         4バイト命令 (compare-equal) (2項目と3項目を比較)
 CMPNE(Rxx, Rxx, Rxx);       %(Rxx = Rxx != Rxx);        21 [Rxx] [Rxx] [Rxx]         4バイト命令 (compare-not-equal)
 CMPL(Rxx, Rxx, Rxx);        %(Rxx = Rxx <  Rxx);        22 [Rxx] [Rxx] [Rxx]         4バイト命令 (compare-less-than)
 CMPGE(Rxx, Rxx, Rxx);       %(Rxx = Rxx >= Rxx);        23 [Rxx] [Rxx] [Rxx]         4バイト命令 (compare-greater-or-equal)
 CMPLE(Rxx, Rxx, Rxx);       %(Rxx = Rxx <= Rxx);        24 [Rxx] [Rxx] [Rxx]         4バイト命令 (compare-less-or-equal)
 CMPG(Rxx, Rxx, Rxx);        %(Rxx = Rxx >  Rxx);        25 [Rxx] [Rxx] [Rxx]         4バイト命令
 TSTZ(Rxx, Rxx, Rxx);                                    26 [Rxx] [Rxx] [Rxx]         4バイト命令
 TSTNZ(Rxx, Rxx, Rxx);                                   27 [Rxx] [Rxx] [Rxx]         4バイト命令
 PCMPE(Rxx, Pxx, Pxx);       %(Rxx = Pxx == Pxx);        28 [Rxx] [Pxx] [Pxx]         4バイト命令
 PCMPEN(Rxx, Pxx);                                       28 [Rxx] [Pxx] FF            4バイト命令
 PCMPNE(Rxx, Pxx, Pxx);      %(Rxx = Pxx != Pxx);        29 [Rxx] [Pxx] [Pxx]         4バイト命令
 PCMPNEN(Rxx, Pxx);                                      29 [Rxx] [Pxx] FF            4バイト命令
 PCMPL(Rxx, Pxx, Pxx);       %(Rxx = Pxx <  Pxx);        2A [Rxx] [Pxx] [Pxx]         4バイト命令
 PCMPGE(Rxx, Pxx, Pxx);      %(Rxx = Pxx >= Pxx);        2B [Rxx] [Pxx] [Pxx]         4バイト命令
 PCMPLE(Rxx, Pxx, Pxx);      %(Rxx = Pxx <= Pxx);        2C [Rxx] [Pxx] [Pxx]         4バイト命令
 PCMPG(Rxx, Pxx, Pxx);       %(Rxx = Pxx >  Pxx);        2D [Rxx] [Pxx] [Pxx]         4バイト命令
 REM(im8,...);                                           FE [im8] ...                 2+nバイト命令 (remark)
-整数レジスタ番号Rxxはすべて1バイトで記述(ただし0~63までしか指定できない)
-im32はビッグエンディアンで書きます(x86とは逆になって、バイナリダンプで読みやすい順序に)

-リマーク命令は主にコンパイラがデバッグ情報を付与するために使う。
--エラー時のデバッグ情報が必要なければ、osecpu.exeはこれを完全に無視して構わない。
--実行結果には影響しない。
 FE 01 00 : DBGINFO1
 FE 01 01 : for命令の開始マーク(実行には関係ないので無視される)
 FE 01 02 : for命令の終了マーク(実行には関係ないので無視される)
 FE 01 03 : CALL/CALLR切り替え用プリフィクス
 FE 01 FC : ALIGNPREFIX0
 FE 01 FD : ALIGNPREFIX1
 FE 01 FF : appackに対して、パディングFの出力を指示
 FE 05 00 line-num. : DBGINFO0
 FE 05 01 func-num. : 関数呼び出し構文開始マーク(実行には関係ないので無視される)
 FE 12 00 flags func-num. P3F param-list R30 : プロトタイプ宣言相当(実行には関係ないので無視される)
** ver.0.37以降
-05: ?
-06: ?
-07: ?

-0A: PLMEM Pxx, typ32, Pxx, membchain
-0B: PSMEM Pxx, typ32, Pxx, membchain
-0C: LEA Pxx, typ32, Pxx, membchain
-0D: 0D [imm8] アサートレベル指定

-1A: DIV, MOD


-1C: PLMT0 Pxx, Pxx (pointer-limit-lower)
-1D: PLMT1 Pxx, Pxx (pointer-limit-upper)
-1F: PCST Pxx, Pxx, typ32, typ32 (pointer-cast)

** 即値指定のやり方
-PADD, OR~MOD, CMPccの命令では、2項目、3項目のRxxで、定数を指定することができます。
-やりかたは、LIMM(R3F, imm);をその命令の直前につけて、命令の中では定数にしたいところをR3Fで埋めてください。
--よくわからなかったら、osecpu_asm.hのADDI()の定義を見てください。
-ADDやANDのように2項目でも3項目でも結果に違いがないときは、3項目にR3Fをおいてください(2項目は定数置換の対象にならないこともありえます)。
-結果的に、CMPcc(R3F, Rxx, R3F);みたいに、R3Fが二度出てしまうこともありますが、問題ありませんので安心してください。第一項のR3Fは定数置換の対象ではありません。

** レジスタの典型的な用法
-R00-R2F : 普通の整数レジスタ
-R30-R3B : テンポラリレジスタ
-R3C-R3E : リザーブ
-R3F : 条件比較慣用句指定用&演算命令即値慣用句指定用
-P00 : ベースポインタ
-P01-P27 : 普通のポインタレジスタ
-P28-P2F : リザーブ
-P30 : リターンアドレス
-P31-P3B : テンポラリレジスタ
-P3C-P3E : リザーブ
-P3F : プログラムカウンタ

** 内部で非公式に使っているコード
 3C : 多数のレジスタをスタックに退避
 3D : 多数のレジスタをスタックから復元
 ED : ASKAがテンポラリレジスタ不足で式の展開をgive-up
 EE : ASKAによる定数によるゼロ割検出
 EF : ASKAのそのほかのエラー
 F0 : データ配置 (→34化を検討中)
 F4 : スタックのアロケート(→30化を検討中)
 F5 : スタックの開放(→31化を検討中)
 F6 : malloc (ver.0.49以降)(→32化を検討中)
 F7 : free (ver.0.49以降)(→33化を検討中)
 FE : 各種リマーク
 FF 00 mm : 即値文字列(8bit単位)(これは内部中間コードで最終的に消える)
 FF 01 mm : 即値文字列(32bit単位)(これは内部中間コードで最終的に消える)


** こめんと欄
-このページにこめんと欄はありません。このページの内容にコメントしたいときは[[impressions]]にお願いします。


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS