このページの目次

組み込みコマンド

組み込みコマンドは代入文を基本とする 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 :

[前] [目次] [次]