<リファレンス>
SfcMini.MachineCodeオブジェクト
(メソッド名無し)
obj([param1 [,param2 [, ...]])
『CallCode』と同じ。
AddCode
obj.AddCode("xx xx xx" [, "xx xx xx" [ , ...]])
マシンコードをHex値で追加します。
戻り値として、最初の1バイト目の格納アドレスを返します。
AddByte
obj.AddByte(bVal [,isRelative])
マシンコードを1バイト追加します。isRelativeにtrueを指定するとジャンプ命令に用いる相対アドレスを代入できます。
戻り値として、格納アドレスを返します。
AddInt16
obj.AddInt16(iVal [,isRelative])
マシンコードを2バイト、16ビット整数値として追加します。isRelativeにtrueを指定するとジャンプ命令に用いる相対アドレスを代入できます。
戻り値として、最初の1バイト目の格納アドレスを返します。
AddInt32
obj.AddInt32(lVal [,isRelative])
マシンコードを4バイト、32ビット整数値として追加します。isRelativeにtrueを指定するとジャンプ命令に用いる相対アドレスを代入できます。
戻り値として、最初の1バイト目の格納アドレスを返します。
CallCode
obj.CallCode([param1 [,param2 [, ...]])
作成されたマシンコードを実行します。パラメータが必要な場合は『param』を引数に指定すれば、スタックに格納された形でコード中で利用可能です。
戻り値として、eaxレジスタの値を返します。
Reset
obj.Reset([cSize])
作成したマシンコードを全て破棄し、cSizeで指定されたバイト数の新たなコード領域を確保します。cSizeを省略すると、256が指定されます。
戻り値はありません。
Address
obj.Address
引数はありません。
戻り値として、マシンコードの開始アドレスを返します。
BufferAddress
obj.Address
引数はありません。
戻り値として、メモリ空間を読み書きできる作業空間として死闘するときの開始アドレスを返します。
eax
obj.eax
引数はありません。
戻り値として、マシンコードを呼び出した後のeaxレジスタの値を返します。
edx
obj.edx
引数はありません。
戻り値として、マシンコードを呼び出した後のedxレジスタの値を返します。
サンプルコード
VBscriptで、かけ算を行うマシン語を実行する例です。添付ファイルの中にサンプルコードとして含まれています。1回目のアセンブルでlabel2、label3のアドレスを取得し、それを2回目のアセンブルで正しく使用しています。
実行結果

obj([param1 [,param2 [, ...]])
『CallCode』と同じ。
AddCode
obj.AddCode("xx xx xx" [, "xx xx xx" [ , ...]])
マシンコードをHex値で追加します。
戻り値として、最初の1バイト目の格納アドレスを返します。
AddByte
obj.AddByte(bVal [,isRelative])
マシンコードを1バイト追加します。isRelativeにtrueを指定するとジャンプ命令に用いる相対アドレスを代入できます。
戻り値として、格納アドレスを返します。
AddInt16
obj.AddInt16(iVal [,isRelative])
マシンコードを2バイト、16ビット整数値として追加します。isRelativeにtrueを指定するとジャンプ命令に用いる相対アドレスを代入できます。
戻り値として、最初の1バイト目の格納アドレスを返します。
AddInt32
obj.AddInt32(lVal [,isRelative])
マシンコードを4バイト、32ビット整数値として追加します。isRelativeにtrueを指定するとジャンプ命令に用いる相対アドレスを代入できます。
戻り値として、最初の1バイト目の格納アドレスを返します。
CallCode
obj.CallCode([param1 [,param2 [, ...]])
作成されたマシンコードを実行します。パラメータが必要な場合は『param』を引数に指定すれば、スタックに格納された形でコード中で利用可能です。
戻り値として、eaxレジスタの値を返します。
Reset
obj.Reset([cSize])
作成したマシンコードを全て破棄し、cSizeで指定されたバイト数の新たなコード領域を確保します。cSizeを省略すると、256が指定されます。
戻り値はありません。
Address
obj.Address
引数はありません。
戻り値として、マシンコードの開始アドレスを返します。
BufferAddress
obj.Address
引数はありません。
戻り値として、メモリ空間を読み書きできる作業空間として死闘するときの開始アドレスを返します。
eax
obj.eax
引数はありません。
戻り値として、マシンコードを呼び出した後のeaxレジスタの値を返します。
edx
obj.edx
引数はありません。
戻り値として、マシンコードを呼び出した後のedxレジスタの値を返します。
サンプルコード
VBscriptで、かけ算を行うマシン語を実行する例です。添付ファイルの中にサンプルコードとして含まれています。1回目のアセンブルでlabel2、label3のアドレスを取得し、それを2回目のアセンブルで正しく使用しています。
option explicit
dim ml,label1,label2,label3,x,y
set ml=CreateObject("SfcMini.MachineCode")
x=cInt(InputBox("x?"))
y=cInt(InputBox("y?"))
call asm
call asm
call ml.CallCode(x,y)
msgbox cStr(x)+" X "+cStr(y)+" = "+cStr(ml.eax)
sub asm()
ml.Reset
ml.AddCode("8b5c2404") 'mov ebx,[esp+04]
ml.AddCode("8b542408") 'mov edx,[esp+08]
ml.AddCode("33c0") 'xor eax,eax
ml.AddCode("b910000000") 'mov ecx,0x10
label1=ml.AddCode("c1eb01") 'shr ebx,0x01
ml.AddCode("0f83"):ml.AddInt32 label2,true 'jnc label2
ml.AddCode("03c2") 'add eax,edx
label2=ml.AddCode("c1e201") 'shl edx,0x01
ml.AddCode("e2"):ml.Addbyte label1,true 'loop label1
ml.AddCode("66a90080") 'test ax,8000
ml.AddCode("0f84"):ml.AddInt32 label3,true 'jz label3
ml.AddCode("0d0000ffff") 'or eax,0xffff0000
label3=ml.AddCode("90") 'nop
end sub
dim ml,label1,label2,label3,x,y
set ml=CreateObject("SfcMini.MachineCode")
x=cInt(InputBox("x?"))
y=cInt(InputBox("y?"))
call asm
call asm
call ml.CallCode(x,y)
msgbox cStr(x)+" X "+cStr(y)+" = "+cStr(ml.eax)
sub asm()
ml.Reset
ml.AddCode("8b5c2404") 'mov ebx,[esp+04]
ml.AddCode("8b542408") 'mov edx,[esp+08]
ml.AddCode("33c0") 'xor eax,eax
ml.AddCode("b910000000") 'mov ecx,0x10
label1=ml.AddCode("c1eb01") 'shr ebx,0x01
ml.AddCode("0f83"):ml.AddInt32 label2,true 'jnc label2
ml.AddCode("03c2") 'add eax,edx
label2=ml.AddCode("c1e201") 'shl edx,0x01
ml.AddCode("e2"):ml.Addbyte label1,true 'loop label1
ml.AddCode("66a90080") 'test ax,8000
ml.AddCode("0f84"):ml.AddInt32 label3,true 'jz label3
ml.AddCode("0d0000ffff") 'or eax,0xffff0000
label3=ml.AddCode("90") 'nop
end sub
実行結果
