組み込みコマンド
組み込みコマンドは代入文を基本とする rvtl の文法から外れた形式になっています。組み込みコマンドの種類ごとに引数の与え方が異なっています。
組み込みコマンドの解析
コマンド先頭の「|」に続く英小文字2-3文字を見てコマンドの種類を判断し、対応するコードを生成します。
25330 :---------------------------------------------------------- 25340 : 組込みコマンド 25350 :---------------------------------------------------------- 25360 ^Com_Function 25370 c=C(I) 25380 I=I+1 25390 ;=c='c' #=^Func_c 25400 ;=c='f' #=^Func_f 25410 ;=c='u' #=^Func_u 25420 ;=c='v' #=^Func_v 25430 ;=c='z' #=^Func_z 25440 #=^Com_Error 25450 ^Func_c 25460 ;=C(I)='a' !=^Func_ca #=^NextCom 25470 ;=C(I)='m' !=^Func_cm #=^NextCom 25480 #=^Com_Error 25490 ^Func_f 25500 ;=C(I)='b' !=^Func_fb #=^NextCom 25510 #=^Com_Error 25520 ^Func_u 25530 ;=C(I)='d' !=^Func_ud #=^NextCom 25540 #=^Com_Error 25550 ^Func_v 25560 ;=C(I)='e' !=^Func_ve #=^NextCom 25570 #=^Com_Error 25580 ^Func_z 25590 ;=C(I)='z' !=^Func_zz #=^NextCom 25600 #=^Com_Error
組み込みコマンド
ファイルの表示
指定したファイルを表示するコードを生成します。
25610 :----------------------------- 25620 : cat 25630 ^Func_ca 25640 ;=D>1 "<cat>" 25650 !=^FuncBegin 25660 +=$1B8B !=^PutObj2 : MOV EBX,[EBX] 25670 +=50 !=^CallLib : call DispFile 25680 ] 25690 :
ファイルパーミッションの設定
chmod コマンドに相当します。 ファイルまたはディレクトリのパーミッションを変更します。 パーミッションは8進数で指定します。ランタイムライブラリの Oct2Bin で 8進数で表された文字列を数値に変換し、ファイル名へのポインタとともにシステムコール (chmod) を呼び出します。
25700 :----------------------------- 25710 : chmod (|cm="644 file") 25720 ^Func_cm 25730 ;=D>1 "<chmod>" 25740 !=^FuncBegin 25750 +=$038B !=^PutObj2 : MOV EAX,[EBX] ; permission 25760 +=$8B !=^PutObj1 25770 +=$045B !=^PutObj2 : MOV EBX,[EBX+4] ; filename 25780 +=74 !=^CallLib : call Oct2Bin 25790 +=$C189 !=^PutObj2 : MOV ECX,EAX 25800 +=$C031 !=^PutObj2 : XOR EAX,EAX 25810 +=$B0 !=^PutObj1 25820 +=15 !=^PutObj1 : MOV AL,SYS_chmod(15) 25830 +=$80CD !=^PutObj2 : INT 0x80 25840 +=$C931 !=^PutObj2 : XOR ECX,ECX 25850 +=$B1 !=^PutObj1 : MOV CL,'|' 25860 +='|' !=^PutObj1 : 25870 +=$89 !=^PutObj1 : MOV [ESI+ECX*4],EAX 25880 +=$8E04 !=^PutObj2 25890 ] 25900 :
URLデコード
URLエンコードされた文字列をデコードするコードを生成します。URLエンコードとは「%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89」のような文字列を文字コードに変換します。上記の文字列は「エンコード」をUTF-8で表して、URLエンコードしたものです。
引数 | 意味 |
---|---|
u[0] | URLエンコード文字列の先頭設定 |
u[1] | 変更範囲の文字数を設定 |
u[2] | デコード後の文字列先頭を設定 |
u[3] | デコード後の文字数を返す |
ランタイムライブラリ用にレジスタを設定して呼び出すコードを生成します。
25910 :----------------------------- 25920 : URL デコード 25930 ^Func_ud 25940 I=I+1 25950 +=$C931 !=^PutObj2 : XOR ECX,ECX 25960 +=$75B1 !=^PutObj2 : MOV CL,'u' 25970 +=$8B !=^PutObj1 25980 +=$8E14 !=^PutObj2 : MOV EDX,[ESI+ECX*4] 25990 +=$028B !=^PutObj2 : MOV EAX,[EDX] 26000 +=$8B !=^PutObj1 26010 +=$045A !=^PutObj2 : MOV EBX,[EDX+4] 26020 +=$8B !=^PutObj1 26030 +=$084A !=^PutObj2 : MOV ECX,[EDX+8] 26040 +=49 !=^CallLib : call URL_Decode 26050 +=$89 !=^PutObj1 26060 +=$0C42 !=^PutObj2 : MOV [EDX+12],EAX 26070 ] 26080 :
rvtlのバージョン
|ve を実行すると「%」にrvtlのバージョンを返すコードを生成します。現バージョンではコンパイルされたプログラムは負の値を返しています。
26090 :----------------------------- 26100 : rvtlcのバージョン 26110 ^Func_ve 26120 +=$DB31 !=^PutObj2 : XOR EBX,EBX 26130 +=$B3 !=^PutObj1 : MOV BL, '%' 26140 +='%' !=^PutObj1 26150 +=$B9 !=^PutObj1 26160 +=-30300 !=^PutObj4 : MOV ECX,-30300 26170 +=$89 !=^PutObj1 : MOV [ESI+EBX*4], ECX 26180 +=$9E0C !=^PutObj2 26190 ] 26200 :
システムコールの実行
変数 a, b, c, d, e, f を引数として任意のシステムコールを実行します。変数 a にはシステムコール番号、b が第1引数、c が第2引数、 あとは同様に第5引数まで指定できます。変数の内容をレジスタに設定して int 0x80 を実行しています。システムコールの結果は eax に返るため、eax の値を「|」に書き込むコードを生成しています。
26210 :----------------------------- 26220 : システムコール呼び出し 26230 ^Func_zz 26240 I=I+1 26250 +=$57 !=^PutObj1 : PUSH EDI 26260 +=$56 !=^PutObj1 : PUSH ESI 26270 +=$F589 !=^PutObj2 : MOV EBP,ESI 26280 +=$C931 !=^PutObj2 : XOR ECX,ECX 26290 +=$61B1 !=^PutObj2 : MOV CL,0x61 'a' 26300 +=$448B !=^PutObj2 26310 +=$008D !=^PutObj2 : MOV EAX,[EBP+ECX*4] 26320 +=$41 !=^PutObj1 : INC ECX 26330 +=$5C8B !=^PutObj2 26340 +=$008D !=^PutObj2 : MOV EBX,[EBP+ECX*4] 26350 +=$41 !=^PutObj1 : INC ECX 26360 +=$41 !=^PutObj1 : INC ECX 26370 +=$548B !=^PutObj2 26380 +=$008D !=^PutObj2 : MOV EDX,[EBP+ECX*4] 26390 +=$41 !=^PutObj1 : INC ECX 26400 +=$7C8B !=^PutObj2 26410 +=$008D !=^PutObj2 : MOV EDI,[EBP+ECX*4] 26420 +=$41 !=^PutObj1 : INC ECX 26430 +=$748B !=^PutObj2 26440 +=$008D !=^PutObj2 : MOV ESI,[EBP+ECX*4] 26450 +=$80 !=^PutObj1 26460 +=$03E9 !=^PutObj2 : SUB CL,3 26470 +=$4C8B !=^PutObj2 26480 +=$008D !=^PutObj2 : MOV ECX,[EBP+ECX*4] 26490 +=$80CD !=^PutObj2 : INT 0x80 26500 +=$5E !=^PutObj1 : POP ESI 26510 +=$5F !=^PutObj1 : POP EDI 26520 +=$C931 !=^PutObj2 : XOR ECX,ECX 26530 +=$B1 !=^PutObj1 : MOV CL,'|' 26540 +='|' !=^PutObj1 : 26550 +=$89 !=^PutObj1 : MOV [ESI+ECX*4],EAX 26560 +=$8E04 !=^PutObj2 26570 : 26580 ]
共通処理
組み込みコマンドに与えた引数を複数の文字列に分解するコードを生成します。
26590 :---------------------------------------------------------- 26600 : 組み込み関数汎用引数処理 26610 : ebx に引数ポインタ配列の先頭アドレスを返す 26620 : ex.[ebx] 第1引数へのポインタ 26630 : [ebx+4] 第2引数へのポインタ 26640 : [ebx+8] 第3引数へのポインタ など. 最終は null 26650 :---------------------------------------------------------- 26660 ^FuncBegin 26670 I=I+1 26680 ;=C(I)<>'*' #=^FuncBegin2 26690 :----------------------------- 26700 : |xx*=e 系 26710 :----------------------------- 26720 ;=D>1 "<*=>" 26730 I=I+2 26740 !=^Expression 26750 !=^XchgAXBX : EBX <--> EAX 26760 : eax のアドレスの引数文字列をASCIIZへのポインタ配列に変換 26770 +=51 !=^CallLib : call FGetArg 26780 ] 26790 :----------------------------- 26800 : |xx " " 系 26810 :----------------------------- 26820 ^FuncBegin2 26830 I=I+1 : skip ' ' 26840 ;=C(I)='"' I=I+1 : skip " 26850 !=^GetString : eax = string top address 26860 : eax のアドレスの引数文字列をASCIIZへのポインタ配列に変換 26870 +=51 !=^CallLib : call FGetArg 26880 ] 26890 :
フレームバッファ関連
フレームバッファを使うための組み込みコマンドです。|fbo, |fbc,|fbs はカーネルがフレームバッファをサポートしていない場合はエラーとなります。それ以外の描画命令はフレームバッファのメモリに対して描画するだけでなく、任意のメモリ領域に対しても実行できます。メモリ中に確保したオフスクリーン領域に対して描画して、フレームバッファに転送することもできます。メモリ領域に対して一括して値を書き込む場合や、メモリのコピーとして使用できます。|fb 命令に与える引数は、各々決まった配列変数をとして渡します。引数を指定している配列のアドレスを渡してランタイムライブラリを呼び出すコードを生成します。
26900 :----------------------------- 26910 : |fb 系 26920 :----------------------------- 26930 ^Func_fb 26940 I=I+1 26950 ;=C(I)='o' #=^Func_fbo : fb open 26960 ;=C(I)='c' #=^Func_fbc : fb close 26970 ;=C(I)='d' #=^Func_fbd : fb dot 26980 ;=C(I)='f' #=^Func_fbf : fb fill 26990 ;=C(I)='l' #=^Func_fbl : fb line 27000 ;=C(I)='m' #=^Func_fbm : fb mem_copy 27010 ;=C(I)='p' #=^Func_fbp : fb put 27020 ;=C(I)='q' #=^Func_fbq : fb put with mask 27030 ;=C(I)='r' #=^Func_fbr : fb fill pattern 27040 ;=C(I)='s' #=^Func_fbs : fb set_screen 27050 ;=C(I)='t' #=^Func_fbt : fb put2 27060 #=^Com_Error 27070 : 27080 ^Func_fbo 27090 +=73 !=^CallLib : call OpenFB 27100 +=$C931 !=^PutObj2 : XOR ECX,ECX 27110 +=$66B1 !=^PutObj2 : MOV CL,'f' 27120 +=$89 !=^PutObj1 : MOV [ESI+ECX*4],EAX 27130 +=$8E04 !=^PutObj2 27140 +=$67B1 !=^PutObj2 : MOV CL,'g' 27150 +=$89 !=^PutObj1 : MOV [ESI+ECX*4],EBX 27160 +=$8E1C !=^PutObj2 27170 ] 27180 : 27190 ^Func_fbc 27200 : 保存済みの設定を復帰 27210 +=63 !=^CallLib : call fb_restore_sc 27220 +=59 !=^CallLib : call fb_unmap_screen 27230 +=53 !=^CallLib : call fbdev_close 27240 ] 27250 : 27260 ^Func_fbd 27270 +=$C931 !=^PutObj2 : xor ecx,ecx 27280 +=$B1 !=^PutObj1 27290 +='d' !=^PutObj1 : mov cl,'d' 27300 +=$8B !=^PutObj1 27310 +=$8E2C !=^PutObj2 : mov ebp,[esi+ecx*4] 27320 +=66 !=^CallLib : Dot 27330 ] 27340 : 27350 ^Func_fbf 27360 +=$C931 !=^PutObj2 : xor ecx,ecx 27370 +=$B1 !=^PutObj1 27380 +='m' !=^PutObj1 : mov cl,'m' 27390 +=$8B !=^PutObj1 27400 +=$8E2C !=^PutObj2 : mov ebp,[esi+ecx*4] 27410 +=71 !=^CallLib : FrameBufferFill 27420 ] 27430 : 27440 ^Func_fbl 27450 +=$C931 !=^PutObj2 : xor ecx,ecx 27460 +=$B1 !=^PutObj1 27470 +='l' !=^PutObj1 : mov cl,'l' 27480 +=$8B !=^PutObj1 27490 +=$8E2C !=^PutObj2 : mov ebp,[esi+ecx*4] 27500 +=65 !=^CallLib : LineDraw 27510 ] 27520 : 27530 ^Func_fbm 27540 +=$C931 !=^PutObj2 : xor ecx,ecx 27550 +=$B1 !=^PutObj1 27560 +='c' !=^PutObj1 : mov cl,'c' 27570 +=$8B !=^PutObj1 27580 +=$8E2C !=^PutObj2 : mov ebp,[esi+ecx*4] 27590 +=72 !=^CallLib : MemCopy 27600 ] 27610 : 27620 ^Func_fbp 27630 +=$C931 !=^PutObj2 : xor ecx,ecx 27640 +=$B1 !=^PutObj1 27650 +='p' !=^PutObj1 : mov cl,'p' 27660 +=$8B !=^PutObj1 27670 +=$8E2C !=^PutObj2 : mov ebp,[esi+ecx*4] 27680 +=67 !=^CallLib : PatternTransfer 27690 ] 27700 : 27710 ^Func_fbq 27720 +=$C931 !=^PutObj2 : xor ecx,ecx 27730 +=$B1 !=^PutObj1 27740 +='q' !=^PutObj1 : mov cl,'q' 27750 +=$8B !=^PutObj1 27760 +=$8E2C !=^PutObj2 : mov ebp,[esi+ecx*4] 27770 +=69 !=^CallLib : MPatternTransfer 27780 ] 27790 : 27800 ^Func_fbr 27810 +=$C931 !=^PutObj2 : xor ecx,ecx 27820 +=$B1 !=^PutObj1 27830 +='r' !=^PutObj1 : mov cl,'r' 27840 +=$8B !=^PutObj1 27850 +=$8E2C !=^PutObj2 : mov ebp,[esi+ecx*4] 27860 +=70 !=^CallLib : PatternFill 27870 ] 27880 : 27890 ^Func_fbs 27900 +=56 !=^CallLib : fb_set_screen 27910 ] 27920 : 27930 ^Func_fbt 27940 +=$C931 !=^PutObj2 : xor ecx,ecx 27950 +=$B1 !=^PutObj1 27960 +='t' !=^PutObj1 : mov cl,'t' 27970 +=$8B !=^PutObj1 27980 +=$8E2C !=^PutObj2 : mov ebp,[esi+ecx*4] 27990 +=68 !=^CallLib : PatternTransfer2 28000 ] 28010 :
[前] [目次] [次]