MMXと3D Now!命令をdb 形式に変換するプログラム ver 1.8 programmed by Herr Mie 98/12/05 1年振りのリニューアル 98/12/06 prefetch[w]のバグ取り(が〜ん、K6-2はprefetchwに非対応) 98/12/08 [q|d]word ptr に暫定的に対応 98/12/10 少しバグ取り 99/09/28 Enhanced 3D Now!に(一部)対応 99/11/03 ebpアドレッシングのバグ修正とgetnum.cの改良(by 計さん) 99/12/21 getnumが空白を考慮していなかったのを修正 【使い方】 コマンドラインでmmx filename.mmxとしてください。 VC++で使うならカスタムビルドで設定しておけば良いでしょう。 filenameに含まれたMMX, 3D Now!命令を16進数に変換し、db,dd命令に置き換えて filename.asmに出力します。 入力ファイル名の拡張子を省略した場合は".mmx"が追加されます。 ロングネーム非対応です。 Phar Lap社の386|ASM TOOK KIT 2.2dでアセンブル出来る形式で出力をしますが、 db,dd命令が使えるアセンブラなら問題なく動作すると思います。 簡単に試した限りではtasm(3.0), lasm(2.071:体験版)でアセンブル出来ました。 【仕様】 ・命令とレジスタは大文字と小文字を区別しません。 ・即値は10進定数しか指定できません。(計算式やマクロ定義は不可) ・ちょっとした四則演算に対応しました。(計さんのおかげです) ・アドレッシングは (d|q)word ptr sreg:[base+index*scale+disp] という形が使えます。 dword ptr, qword ptr, ptrは省略可能です。記述すると'[',']'を省略出来ます。 ただし、現在オペランドサイズのチェックはしません。 sregはセレクタ(cs,ds,ss,es,fs,gs)を指定可能です。 base,index,dispの順序は任意です。 indexはreg*?という形で書いてください。?*regはエラーになります。 左にあるレジスタを優先的にbaseレジスタとして処理します。 x86CPUにはindexレジスタにはespを使えないという仕様があるため movq mm0,[eax+esp] はエラーになります。 movq mm0,[esp+eax] としてください。 例) movq mm0,qword ptr PI ;ptr演算子を書いたので[]は省略できる。 psrlq mm3,SHIFT_PT ;即値には計算式/マクロは使えないのでエラー。 pfmul mm3,[edi*8+DATA] ;dispにラベルを使うことは可能。 pfadd mm2,buffer ;[]で括っていないのでエラー。 【もろもろ】 ・出来立てほやほやなのでどんなバグがあるか分かりません。 何か変だと思ったらメールを下さると嬉しいです。 あと、インラインアセンブラやgasに対応させるにはencode.c内のputEncodeを いじればすぐ出来ると思います。 と思ったけどVC++にはdd命令が無い?困った。 【謝辞】 友達に借りた『K6 PERFECT BOOK』(SOFT BANK)を参照しました。 #が、一部命令コードが変。packsswb MMX,MEMのopecodeは0x63が正しい気がする... エル・エス・アイ ジャパンのLSI C-86 Ver 3.30c 試食版でコンパイルしました。 どうもありがとうございます。 光成滋生 shigeo@kurims.kyoto-u.ac.jp