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]]にお願いします。