こんにちは。
アセンブリソースを見る限りは返り値を0xffにする、ということですね?
良くわかりませんが、適当に作ってみました。
無駄などがあるかもしれませんが、ご参考程度に。
#uselib "kernel32.dll"
#func global VirtualProtect "VirtualProtect" var,int,int,var
#define global exedim(%1,%2)dim %1,%2:VirtualProtect %1, %2*4,$40,AZSD
#module "MachineCode"
#deffunc muimi
if pmui=0{exedim mui,2 : pmui=varptr.mui
mui.0=$0000FFB8,$0000C300 }
prm=0
return callfunc(prm,pmui,0)
#global
muimi
mes stat
stop
まずはアセンブリ言語においては関数ではなくプロシージャという概念を用います。
プロシージャに関しては
http://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%B7%E3%83%BC%E3%82%B8%E3%83%A3
で解説されています。
実行されている位置は恐らくcallfuncでしょう。
それ以外に考えにくいです。
”関数のようなもの”にするためにはHSPの方で書き換えれば良いです。
マシン語自体に関数、もしくは命令という概念はありません。
自分はマシン語作成の際(とはいえこれが二度目ですが)にはMASMと呼ばれるアセンブラを用いています。
ビルドの際のbatは以下になります。
\masm32\bin\ml /AT /Bl \masm32\bin\link16 /Fe test001.bin test001.asm
pause
あらかじめ16bit用のリンカを用意する必要がありますね。
上記batを見ていただければわかると思いますが、link16.exeという名前に改名して保存してあります。
あと2行目のpauseを書いておくことによってビルド時にエラーが出たときにその画面のまま停止しておいてくれます。
(これがないとXPはすぐに消えちゃうんですよね)
長くなってしまいましたが、以下にマシン語のソースを記して終わりにさせていただきます。
.386
.MODEL TINY,STDCALL
OPTION SEGMENT:USE32
.CODE
muimi PROC
mov eax, 0ffh
ret
muimi ENDP
END muimi
axではなくeaxを用いたのは返り値が1byteを超過する場合に0xffにならない可能性を見越してのことです。
それでは、失礼いたします。