(スクリプト中でtds12さんのコールバック関数作成モジュールに負数を渡していたのを修正しました)
(具体的な修正スクリプトを記載しました)
(それ以外は12/15の投稿とだいたい同じです)
しろうとなので何か間違えているかもしれません
間違えていたらごめんなさい。
ポインタの参照先のアドレスの数字があちこちに行かないようにしているのではなくて
ポインタ変数自体の最適化を抑止しているとは思いませんでした
(int * volatile _thisptr=(int*)0; ではなくて int volatile * _thisptr=(int*)0; であったということです)
またこの場合は
__asm{
mov eax, _thisptr
mov [eax],ecx
}
のようにするといいと思います
この_thisptrはレジスタ変数ではなくてスタック領域を使用しているためです([ebp-40]になります)
何か間違いがあればごめんなさい
ソースコードは何か間違いがあるかもしれません
わたしのかいたtds12さんのソースコードはだいたいあっていますか
具体的なスクリプト(マシン語部分のみ抜粋)にすると
引き数があるときは
dim clbk,58
clbk.0 = $83ec8b55, $45c730ec, $000000fc, $f845c700
clbk.4 = $00000000, $00e045c7, $c7000000, $0000e445
clbk.8 = $45c70000, $000000ec, $d845c700, $00000000
clbk.12 = $89d8458b, $f8458b08, $5002e0c1, $ffe04d8b
clbk.16 = $04c483d1, $c7d44589, $0000f445, $45c70000
clbk.20 = $000000dc, $f045c700, $00000000, $00e845c7
clbk.24 = $8d000000, $55890c55, $d4458be8, $89084d8b
clbk.28 = $d045c708, $00000001, $558b09eb, $01c283d0
clbk.32 = $8bd05589, $4539f845, $8b1a7dd0, $c183e84d
clbk.36 = $e84d8904, $8bd0558b, $4d8bd445, $fc498be8
clbk.40 = $eb900c89, $f4558bd5, $89f8458b, $dc4d8b02
clbk.44 = $89d4558b, $00006811, $458b0000, $83d0ffec
clbk.48 = $4d8b04c4, $89118bf0, $45c7fc55, $000000e8
clbk.52 = $d4458b00, $e44d8b50, $c483d1ff, $fc458b04
clbk.56 = $c25de58b, $00000000
lpoke clbk,$10,argmax:lpoke clbk,$17,ptrtomalloc:lpoke clbk,$1e,ptrtofree
lpoke clbk,$25,code_callptr:lpoke clbk,$2c,varptr(thisptr)
lpoke clbk,$4a,varptr(ctx) + 36:lpoke clbk,$51,varptr(ctx) + 40
lpoke clbk,$58,varptr(ctx) + 784:lpoke clbk,$b6,ilb
if ((mode & $f) == CLBKMODE_CDECL) == 0:wpoke clbk,$e4,(argmax * 4) & $ffff
funcsize = 230
引き数がないときは
dim clbk,25
clbk.0 = $83ec8b55, $45c718ec, $000000fc, $f045c700
clbk.4 = $00000000, $00f845c7, $c7000000, $0000e845
clbk.8 = $45c70000, $000000f4, $ec45c700, $00000000
clbk.12 = $89ec458b, $f8458b08, $000000c7, $4d8b0000
clbk.16 = $0001c7e8, $68000000, $00000000, $fff0558b
clbk.20 = $04c483d2, $8bf4458b, $fc4d8908, $8bfc458b
clbk.24 = $00c35de5
lpoke clbk,$10,code_callptr:lpoke clbk,$17,varptr(ctx) + 36
lpoke clbk,$1e,varptr(ctx) + 40:lpoke clbk,$25,varptr(ctx) + 784
lpoke clbk,$2c,varptr(thisptr):lpoke clbk,$48,ilb
funcsize = 99
になります
わたしの実験
ecxレジスタに数字をいれられるcallfuncのようなモジュール
http://nopswebpages.webcrow.jp/apps/calfnc3.txt
tds12さんのモジュール
dim bin,5
newclbk3 bin.0,2,*raberu
newclbk3 bin.1,0,*raberu
newclbk3 bin.2,1,*raberu
newclbk3 bin.3,0,*raberu
newclbk3 bin.4,2,*raberu2
hikisuu=2,3
cls
title "関数呼び出し2"
mes "第2パラメータ(引き数の数)のテスト"
foreach bin
thisptr@modclbk3b2=111+cnt
mes ""+cnt+"番の結果"+callfunc3(hikisuu,bin.cnt,2)
loop
stop
*raberu
mes "ecxレジスタ="+clbk_getthisptr()+" wparam="+wparam+" lparam="+lparam
return 1192
*raberu2
mes "ecxレジスタ="+clbk_getthisptr()
clbkargprotect funcargs
thisptr@modclbk3b2=111
mes "サブルーチンの中からサブルーチンの呼び出し="+callfunc3(funcargs,bin.0,2,10)
return 794
わたしのモジュール
dim bin,5
makeclbkfunc bin.0,2,*raberu
makeclbkfunc bin.1,-1,*raberu
makeclbkfunc bin.2,1,*raberu
makeclbkfunc bin.3,0,*raberu
makeclbkfunc bin.4,2,*raberu2
hikisuu=2,3
cls
title "関数呼び出し2"
mes "第2パラメータ(引き数の数)のテスト"
foreach bin
p_this@_modulemakeclbkfunca =111+cnt
mes ""+cnt+"番の結果"+callfunc3(hikisuu,bin.cnt,2,2)
loop
stop
*raberu
mes "ecxレジスタ="+ecxclbkfunc()+" wparam="+wparam+" lparam="+lparam
return 1192
*raberu2
argclbkfunc funcargs
p_this@_modulemakeclbkfunca=123
mes "サブルーチンの中からサブルーチンの呼び出し="+callfunc3(funcargs,bin.0,2,10)
return 794