(メソッド名無し)

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





























実行結果
3 x 5 = 15