式の処理
式は !=^Expression とすると式の値を ebx レジスタに返すコードを生成します。rvtl は演算子に優先順位がなく左から右に順に評価するため、比較的簡単にコード生成できます。
式=項+項[+項...] +の部分には色々な演算子が入ります。
「括弧で囲まれた式」は「項」となります。また配列は「項」ですがインデックスは「式」であるため、再帰呼び出しを考えたコードを生成する必要があります。
項
項は式の最小単位で eax レジスタに値を返すコードを生成します。
項の処理
rvtlのコマンドは式の値を変数に代入する形式が基本となっています。したがって、いろいろな機能を式に埋め込む必要があるため、項には演算以外の機能があります。
16480 :---------------------------------------------------------- 16490 : 項の処理 16500 : 値を eax に返す。ebx を保存する必要がある 16510 :---------------------------------------------------------- 16520 ^Term 16530 ;=D>1 "<Term>" 16540 c=C(I) I=I+1 16550 ;=((c>='0')&(c<='9'))+(c='$') !=^TermNum #=^TermExit 16560 ;=(c=$27) !=^TermChar #=^TermExit : ' 16570 ;=(c='(') !=^TermBracket #=^TermExit 16580 ;=(c='`') !=^TermRandom #=^TermExit 16590 ;=(c='-') !=^TermNeg #=^TermExit 16600 ;=(c='+') !=^TermAbs #=^TermExit 16610 ;=(c='@') !=^TermRealKey #=^TermExit 16620 ;=(c=';') !=^TermPop #=^TermExit 16630 ;=(c='^') !=^TermLabel #=^TermExit 16640 ;=(c='.') !=^TermWinSize #=^TermExit 16650 ;=(c='_') !=^TermTime #=^TermExit 16660 ;=(c='?') !=^TermInput #=^TermExit 16670 ;=(c='\') !=^TermArg #=^TermExit 16680 !=^TermVar : その他の変数,配列参照 16690 ^TermExit 16700 ] 16710 :
1行入力
入力された行のバッファ先頭アドレスを eax に返すコードを生成します。
13660 :---------------------------------------------------------- 13670 : 1行入力 =$$ バッファ先頭アドレスを返す 13680 :---------------------------------------------------------- 13690 ^LineInput 13700 ;=D>1 "<LineInput>" 13710 I=I+1 13720 !=^PushBX 13730 : eax:バッファサイズ, ebx:バッファ先頭 13740 : eax に入力文字数を返す 13750 +=43 !=^CallLib : StringInput 13760 +=$C931 !=^PutObj2 : XOR ECX,ECX 13770 !=^XchgAXBX : eax バッファ先頭 13780 +=$B1 !=^PutObj1 : MOV CL, '%' 13790 +='%' !=^PutObj1 13800 +=$89 !=^PutObj1 : MOV [ESI+ECX*4],EBX 13810 +=$8E1C !=^PutObj2 13820 !=^PopBX 13830 ] 13840 :
1文字入力
入力された文字コードを eax に返すコードを生成します。
13850 :---------------------------------------------------------- 13860 : 1文字入力 =$ 13870 :---------------------------------------------------------- 13880 ^CharInput 13890 ;=D>1 "<CharInput>" 13900 +=22 !=^CallLib : CALL InChar 13910 ] 13920 :
数値
ソースから10進定数、16進定数を読んで値を eax に設定するコードを生成します。文字入力($)、行入力($$)の場合は、それぞれCharInput、LineInputに処理を渡します。
13930 :---------------------------------------------------------- 13940 : 項 数値 13950 :---------------------------------------------------------- 13960 ^TermNum 13970 +r 13980 ;=(c='$')&(C(I)='$') !=^LineInput -r ] 13990 ;=(c='$')&((C(I)=' ')|(C(I)=0)) !=^CharInput -r ] 14000 ;=D>1 "<Num>" 14010 I=I-1 14020 !=^GetNo 14030 ;=C(I-1)='$' ] 14040 +=$B8 !=^PutObj1 : MOV EAX,r 14050 +=r !=^PutObj4 14060 -r 14070 ] 14080 :
文字定数
文字定数(1-4バイト)を eax に設定するコードを生成します。
14090 :---------------------------------------------------------- 14100 : 項 1文字 14110 :---------------------------------------------------------- 14120 ^TermChar 14130 +r 14140 ;=D>1 "<Char>" 14150 r=0 14160 @ 14170 c=C(I) 14180 ;=c<>$27 r=r<<8+c 14190 I=I+1 14200 @=(c=$27) 14210 +=$B8 !=^PutObj1 : MOV EAX,r 14220 +=r !=^PutObj4 14230 -r 14240 ] 14250 :
カッコ
式の左側(処理済み)はebxに入っているので、ebx をスタックに退避(push ebx)した後、式の処理を行い、結果をEAXに転送して、ebx を復帰(pop ebx)します。
14260 :---------------------------------------------------------- 14270 : 項 括弧 14280 :---------------------------------------------------------- 14290 ^TermBracket 14300 ;=D>1 " (" 14310 !=^PushBX 14320 !=^Expression 14330 !=^XchgAXBX 14340 !=^PopBX 14350 ;=D>1 ") " 14360 ;=(C(I)<>')') !=^Com_Error : ERROR_CLOSE_BRACKET 14370 I=I+1 14380 ] 14390 :
乱数
Mersenne Twister で生成した整数を eax に返すコードを生成します。
14400 :---------------------------------------------------------- 14410 : 項 乱数 14420 :---------------------------------------------------------- 14430 ^TermRandom 14440 ;=D>1 "<Rand>" 14450 +=36 !=^CallLib : CALL genrand 14460 ] 14470 :
負
項の処理をした後、正負を反転するコードを生成します。
14480 :---------------------------------------------------------- 14490 : 項 負 14500 :---------------------------------------------------------- 14510 ^TermNeg 14520 ;=D>1 "<Neg>" 14530 !=^Term 14540 +=$D8F7 !=^PutObj2 : NEG EAX 14550 ] 14560 :
絶対値
項の処理をした後、絶対値を求め eax に設定するコードを生成します。
14570 :---------------------------------------------------------- 14580 : 項 絶対値 14590 :---------------------------------------------------------- 14600 ^TermAbs 14610 ;=D>1 "<Abs>" 14620 !=^Term 14630 +=$C009 !=^PutObj2 : OR EAX,EAX 14640 +=$027D !=^PutObj2 : JAE 02 14650 +=$D8F7 !=^PutObj2 : NEG EAX 14660 ] 14670 :
数値入力
入力された数値を eax に返すコードを生成します。
14680 :---------------------------------------------------------- 14690 : 項 数値入力 14700 :---------------------------------------------------------- 14710 ^TermInput 14720 ;=D>1 "<NumInput>" 14730 !=^PushBX 14740 +=42 !=^CallLib : CALL NumInput 14750 !=^XchgAXBX : eax = number 14760 !=^PopBX 14770 ] 14780 :
リアルタイム文字入力
キーが押されていたら押された文字コードを eax に返すコードを生成します。
14790 :---------------------------------------------------------- 14800 : 項 リアルタイム文字入力 14810 :---------------------------------------------------------- 14820 ^TermRealKey 14830 ;=D>1 "<RealKey>" 14840 +=30 !=^CallLib : CALL RealKey 14850 ] 14860 :
変数スタック取出し
変数スタックのトップを取り出して eax に設定するコードを生成します。
14870 :---------------------------------------------------------- 14880 : 項 変数スタック Pop 14890 :---------------------------------------------------------- 14900 ^TermPop 14910 ;=D>1 "<pop>" 14920 +=$C781 !=^PutObj2 : ADD EDI,4 14930 +=04 !=^PutObj4 14940 +=$078B !=^PutObj2 : MOV EAX,[EDI] 14950 ] 14960 :
ラベル参照
GOTO(#=)やGOSUB(!=)の飛び先をラベルとした場合、ラベル宣言した行の次の行のアドレスを eax に返すコードを生成します。
14970 :---------------------------------------------------------- 14980 : 項 ラベル ラベル文字列 最大11文字まで 14990 :---------------------------------------------------------- 15000 ^TermLabel 15010 +nr 15020 ;=D>1 "<Label>" 15030 r=0 15040 ;=Q=1 @ I=I+1 @=((C(I)=' ')|(C(I)=0)) 15050 ;=Q>1 !=^SearchLabel n=r+1 : ラベルの次行を探す 15060 ;=r<0 / "Label not Found!" !=^Com_Error 15070 ;=Q>1 !=^SearchLine 15080 +=$B8 !=^PutObj1 : MOV EAX,r 15090 +=r !=^PutObj4 15100 -rn 15110 ] 15120 :
ウィンドウサイズ取得
現在使用しているコンソールの桁数を eax の上位16ビット、行数を eax の下位16ビットに返すコードを生成します。
15130 :---------------------------------------------------------- 15140 : 項 ウィンドウサイズ 15150 :---------------------------------------------------------- 15160 ^TermWinSize 15170 ;=D>1 "<WinSize>" 15180 +=31 !=^CallLib : WinSize 15190 ] 15200 :
時刻取得
現在時刻(UNIX時間:1970年1月1日から経過した秒数)が eax に返ります。マイクロ秒を変数%に代入します。
15210 :---------------------------------------------------------- 15220 : 項 時間 15230 :---------------------------------------------------------- 15240 ^TermTime 15250 ;=D>1 "<Time>" 15260 +=37 !=^CallLib : GetTime 15270 +=$C889 !=^PutObj2 : MOV EAX,ECX 15280 +=$C931 !=^PutObj2 : XOR ECX,ECX 15290 +=$B1 !=^PutObj1 : MOV CL, '%' 15300 +='%' !=^PutObj1 15310 +=$89 !=^PutObj1 : MOV [ESI+ECX*4], EDX 15320 +=$8E14 !=^PutObj2 15330 ] 15340 :
コマンドライン引数参照
指定した番号のコマンドライン引数文字列の先頭アドレスを eax に返すコードを生成します。「\0」とした場合には1番目のコマンドライン引数文字列(argv[1])が返ります。
15350 :---------------------------------------------------------- 15360 : 項 コマンドライン引数 15370 :---------------------------------------------------------- 15380 ^TermArg 15390 ;=(c='\')&(C(I)='\') !=^TermEnv ] 15400 +r 15410 ;=D>1 "<Arg>" 15420 !=^PushBX 15430 !=^Expression 15440 +=$43 !=^PutObj1 : INC EBX (argv[1]から) 15450 +=44 !=^CallLib : GetArg 15460 !=^PopBX 15470 -r 15480 ] 15490 :
環境変数参照
指定した番号の環境変数文字列の先頭アドレスを eax に返すコードを生成します。
15500 :---------------------------------------------------------- 15510 : 項 環境変数 15520 :---------------------------------------------------------- 15530 ^TermEnv 15540 ;=D>1 "<Env>" 15550 I=I+1 15560 +r 15570 !=^PushBX 15580 !=^Expression 15590 +=45 !=^CallLib : GetEnv 15600 !=^PopBX 15610 -r 15620 ] 15630 :
変数と配列
変数の値または配列の値を eax に設定するコードを生成します。配列の参照は、最初に ebx をスタックに退避した後、配列のインデックスの式を処理します。配列のサイズを乗じた後、配列変数の内容(アドレス)に加えたアドレスから読み出したものを eax に転送します。最後に ebx を復帰します。
15640 :---------------------------------------------------------- 15650 : 配列 1バイト : 値を EAX に返す 15660 :---------------------------------------------------------- 15670 ^Array1 15680 +c 15690 ;=D>1 "<Array1>" 15700 !=^PushBX 15710 !=^Expression 15720 -c 15730 +=$8E8B !=^PutObj2 15740 +=c*4 !=^PutObj4 : MOV ECX,[ESI+c*4] 15750 +=$C031 !=^PutObj2 : XOR EAX, EAX 15760 +=$8A !=^PutObj1 15770 +=$1904 !=^PutObj2 : MOV AL,[ECX+EBX*4] 15780 !=^PopBX 15790 I=I+1 15800 ] 15810 : 15820 :---------------------------------------------------------- 15830 : 配列 2バイト : 値を EAX に返す 15840 :---------------------------------------------------------- 15850 ^Array2 15860 +c 15870 ;=D>1 "<Array2>" 15880 !=^PushBX 15890 !=^Expression 15900 -c 15910 +=$8E8B !=^PutObj2 15920 +=c*4 !=^PutObj4 : MOV ECX,[ESI+c*4] 15930 +=$C031 !=^PutObj2 : XOR EAX, EAX 15940 +=$8B66 !=^PutObj2 15950 +=$5904 !=^PutObj2 : MOV AX,[ECX+EBX*4] 15960 !=^PopBX 15970 I=I+1 15980 ] 15990 : 16000 :---------------------------------------------------------- 16010 : 配列 4バイト : 値を EAX に返す 16020 :---------------------------------------------------------- 16030 ^Array4 16040 +c 16050 ;=D>1 "<Array4>" 16060 !=^PushBX 16070 !=^Expression 16080 -c 16090 +=$8E8B !=^PutObj2 16100 +=c*4 !=^PutObj4 : MOV ECX,[ESI+c*4] 16110 +=$8B !=^PutObj1 16120 +=$9904 !=^PutObj2 : MOV EAX,[ECX+EBX*4] 16130 !=^PopBX 16140 I=I+1 16150 ] 16160 : 16170 :---------------------------------------------------------- 16180 : 変数の冗長部分の読み飛ばし 16190 : 英文字以外の最初の文字がIに返る 16200 :---------------------------------------------------------- 16210 ^SkipAlfa 16220 +c 16230 I=I-1 16240 @ 16250 I=I+1 c=C(I) 16260 @=(((c<'A')+(c>'Z'))&((c<'a')+(c>'z'))) 16270 -c 16280 ] 16290 : 16300 :---------------------------------------------------------- 16310 : 変数項 : 値を EAX に返す cに変数名 16320 :---------------------------------------------------------- 16330 ^TermVar 16340 +d 16350 ;=D>1 "<Var>" 16360 !=^SkipAlfa 16370 d=C(I) 16380 ;=(d='(') I=I+1 !=^Array1 #=^var : Array 1 byte 16390 ;=(d='{') I=I+1 !=^Array2 #=^var : Array 2 byte 16400 ;=(d='[') I=I+1 !=^Array4 #=^var : Array 4 byte 16410 +=$868B !=^PutObj2 : Simple Var 16420 +=c*4 !=^PutObj4 : MOV EAX,[ESI + c] 16430 ^var 16440 : I=I+1 16450 -d 16460 ] 16470 :
式
式の値(項と項を演算した結果)を ebx レジスタに値を返すコードを生成します。
式の処理
演算子の左側の項(または複数の項間の演算)の値を ebx に置き、右側の項の値を eax に設定して演算、結果を ebx に残すコードを生成します。
18360 :---------------------------------------------------------- 18370 : 式の処理 項 + 項 18380 : 前の項の値を ebx にコピーし、eax に変える次の項の値と演算、 18390 : 結果を ebx に返すコードを生成 18400 :---------------------------------------------------------- 18410 ^Expression 18420 ;=D>1 "<Expr>" 18430 +f 18440 !=^Term : 1st term --> AX 18450 !=^XchgAXBX : BX <-----> AX 18460 f=0 18470 @ 18480 c=C(I) I=I+1 18490 ;=(c='+') !=^ExpAdd #=^exp 18500 ;=(c='-') !=^ExpSub #=^exp 18510 ;=(c='*') !=^ExpMul #=^exp 18520 ;=(c='/') !=^ExpDiv #=^exp 18530 ;=(c='=') !=^ExpEqu #=^exp 18540 ;=(c='|') !=^ExpOr #=^exp 18550 ;=(c='&') !=^ExpAnd #=^exp 18560 ;=(c='^') !=^ExpXor #=^exp 18570 ;=(c='\') !=^ExpUDiv #=^exp 18580 ;=(c='<') !=^ExpLess #=^exp 18590 ;=(c='>') !=^ExpGreater #=^exp 18600 I=I-1 18610 f=1 : end of expresion 18620 ^exp 18630 @=(f) 18640 -f 18650 ] 18660 :
演算
一般的な演算を行います。
加算
これまで演算を行った式の左側(ebx)と右側の項(eax)を加算します。
16720 :---------------------------------------------------------- 16730 : 式 加算 16740 :---------------------------------------------------------- 16750 ^ExpAdd 16760 ;=D>1 "<+>" 16770 !=^Term : 2nd term --> EAX 16780 +=$C301 !=^PutObj2 : ADD EBX,EAX 16790 ] 16800 :
減算
これまで演算を行った式の左側(ebx)から右側の項(eax)を減算します。
16810 :---------------------------------------------------------- 16820 : 式 減算 16830 :---------------------------------------------------------- 16840 ^ExpSub 16850 ;=D>1 "<->" 16860 !=^Term : 2nd term --> EAX 16870 +=$C329 !=^PutObj2 : SUB EBX,EAX 16880 ] 16890 :
乗算
これまで演算を行った式の左側(ebx)と右側の項(eax)を乗算します。
16900 :---------------------------------------------------------- 16910 : 式 乗算 16920 :---------------------------------------------------------- 16930 ^ExpMul 16940 ;=D>1 "<*>" 16950 !=^Term : 2nd term --> EAX 16960 !=^XchgAXBX 16970 +=$EBF7 !=^PutObj2 : IMUL EBX 16980 !=^XchgAXBX 16990 ] 17000 :
除算
これまで演算を行った式の左側(ebx)を右側の項(eax)で除算します。商を eax、剰余を「%」に設定します。
17010 :---------------------------------------------------------- 17020 : 式 除算 17030 :---------------------------------------------------------- 17040 ^ExpDiv 17050 ;=D>1 "</>" 17060 !=^Term : 2nd term --> EAX 17070 !=^XchgAXBX 17080 +=$99 !=^PutObj1 : CDQ 17090 +=$FBF7 !=^PutObj2 : IDIV EBX 17100 +=$C931 !=^PutObj2 : XOR ECX,ECX 17110 +=$B1 !=^PutObj1 : MOV CL, '%' 17120 +='%' !=^PutObj1 17130 +=$89 !=^PutObj1 : MOV [ESI+ECX*4], EDX 17140 +=$8E14 !=^PutObj2 17150 !=^XchgAXBX 17160 ] 17170 :
無符号除算
これまで演算を行った式の左側(ebx)を右側の項(eax)で無符号除算します。商を eax、剰余を「%」に設定します。
17180 :---------------------------------------------------------- 17190 : 式 無符号除算 \ 17200 :---------------------------------------------------------- 17210 ^ExpUDiv 17220 ;=D>1 "<\>" 17230 !=^Term : 2nd term --> EAX 17240 !=^XchgAXBX 17250 +=$D231 !=^PutObj2 : XOR EDX,EDX 17260 +=$F3F7 !=^PutObj2 : DIV EBX 17270 +=$C931 !=^PutObj2 : XOR ECX,ECX 17280 +=$B1 !=^PutObj1 : MOV CL, '%' 17290 +='%' !=^PutObj1 17300 +=$89 !=^PutObj1 : MOV [ESI+ECX*4], EDX 17310 +=$8E14 !=^PutObj2 17320 !=^XchgAXBX 17330 ] 17340 :
OR
これまで演算を行った式の左側(ebx)と右側の項(eax)のビット論理和を求めます。
17350 :---------------------------------------------------------- 17360 : 式 OR 17370 :---------------------------------------------------------- 17380 ^ExpOr 17390 ;=D>1 "<|>" 17400 !=^Term : 2nd term --> EAX 17410 +=$C309 !=^PutObj2 : OR EBX, EAX 17420 ] 17430 :
AND
これまで演算を行った式の左側(ebx)と右側の項(eax)のビット論理積を求めます。
17440 :---------------------------------------------------------- 17450 : 式 AND 17460 :---------------------------------------------------------- 17470 ^ExpAnd 17480 ;=D>1 "<&>" 17490 !=^Term : 2nd term --> EAX 17500 +=$C321 !=^PutObj2 : AND EBX,EAX 17510 ] 17520 :
XOR
これまで演算を行った式の左側(ebx)と右側の項(eax)の排他的論理和を求めます。
17530 :---------------------------------------------------------- 17540 : 式 XOR 17550 :---------------------------------------------------------- 17560 ^ExpXor 17570 ;=D>1 "<^>" 17580 !=^Term : 2nd term --> EAX 17590 +=$C331 !=^PutObj2 : XOR EBX,EAX 17600 ] 17610 :
比較演算
「<」と「>」は比較だけでなくシフト演算にも使うため少し複雑です。比較演算は演算結果が真なら「1」、偽なら「0」を返します。
17620 :---------------------------------------------------------- 17630 : 比較演算子 17640 : >, >=, <, <=, <>, = 17650 : ebx と eax を比較して値を ebx に返すコードを生成 17660 :---------------------------------------------------------- 17670 ^OpRelative 17680 -w 17690 +=$C339 !=^PutObj2 : CMP EBX,EAX 17700 +=$BB !=^PutObj1 : MOV EBX,0001 17710 +=$0001 !=^PutObj4 17720 +=w !=^PutObj1 : Jcc 02 (skip xor) 17730 +=$02 !=^PutObj1 17740 +=$DB31 !=^PutObj2 : XOR EBX,EBX 17750 ] 17760 : 17770 :---------------------------------------------------------- 17780 : 式 比較 等しい 17790 :---------------------------------------------------------- 17800 ^ExpEqu 17810 ;=D>1 "<=>" 17820 !=^Term 17830 +=$74 17840 !=^OpRelative : JZ 17850 ] 17860 : 17870 :---------------------------------------------------------- 17880 : 式 比較 より小さい <, <=, <<, <> 17890 :---------------------------------------------------------- 17900 ^ExpLess 17910 ;=D>1 "<<->" 17920 c=C(I) 17930 ;=(c='>') I=I+1 !=^Term +=$75 !=^OpRelative ] : JNZ 17940 ;=(c='=') I=I+1 !=^Term +=$7E !=^OpRelative ] : JLE 17950 ;=(c='<') I=I+1 !=^Term !=^ShiftLeft ] 17960 !=^Term +=$7C !=^OpRelative : JL 17970 ] 17980 :
18250 :---------------------------------------------------------- 18260 : 式 比較 より大きい >, >=, >> 18270 :---------------------------------------------------------- 18280 ^ExpGreater 18290 ;=D>1 "<>->" 18300 c=C(I) 18310 ;=(c='=') I=I+1 !=^Term +=$7D !=^OpRelative ] : JGE xx 18320 ;=(c='>') I=I+1 !=^Term !=^ShiftRight ] 18330 !=^Term +=$7F !=^OpRelative : JG xx 18340 ] 18350 :
シフト
シフト演算を行います。シフト量が32ビットを超える場合は ebx の値を0にします。
17990 :---------------------------------------------------------- 18000 : 式 右シフト >> 18010 :---------------------------------------------------------- 18020 ^ShiftRight 18030 +=$C189 !=^PutObj2 : MOV ECX, EAX 18040 +=$80 !=^PutObj1 : CMP CL, 32 18050 +=$20F9 !=^PutObj2 18060 +=$7E !=^PutObj1 : JLE 02 18070 +=$02 !=^PutObj1 18080 +=$DB31 !=^PutObj2 : XOR EBX,EBX 18090 +=$EBD3 !=^PutObj2 : SHR EBX,CL 18100 ] 18110 : 18120 :---------------------------------------------------------- 18130 : 式 左シフト << 18140 :---------------------------------------------------------- 18150 ^ShiftLeft 18160 +=$C189 !=^PutObj2 : MOV ECX, EAX 18170 +=$80 !=^PutObj1 : CMP CL, 32 18180 +=$20F9 !=^PutObj2 18190 +=$7E !=^PutObj1 : JLE 02 18200 +=$02 !=^PutObj1 18210 +=$DB31 !=^PutObj2 : XOR EBX,EBX 18220 +=$E3D3 !=^PutObj2 : SHL EBX, CL 18230 ] 18240 :
少しだけ最適化
xchg eax,ebx が連続する場合と、pop ebx, push ebx と連続する場合は命令を出力しません。
13430 :---------------------------------------------------------- 13440 : EBX(式の結果)を退避 13450 :---------------------------------------------------------- 13460 ^XchgAXBX 13470 ;=Obj(P-1)=$93 P=P-1 ] : if XCHG EAX,EBX 13480 +=$93 !=^PutObj1 : XCHG EAX,EBX 13490 ] 13500 : 13510 :---------------------------------------------------------- 13520 : EBX(式の結果)を退避 PUSH EBX 13530 :---------------------------------------------------------- 13540 ^PushBX 13550 ;=Obj(P-1)=$5B P=P-1 ] : if POP EBX 13560 +=$53 !=^PutObj1 : PUSH EBX 13570 ] 13580 : 13590 :---------------------------------------------------------- 13600 : EBX(式の結果)を復帰 POPH EBX 13610 :---------------------------------------------------------- 13620 ^PopBX 13630 +=$5B !=^PutObj1 : PUSH EBX 13640 ] 13650 :
[前] [目次] [次]