我在function使用内嵌汇编(已经通过DLL,注入到某个游戏中去了)
function UseItem(var Bag_itemId; Bmun: DWORD):single;
asm
pushad
push 1 // Arg4 = 00000001
push Bag_itemId // Arg3 物品ID
push Bmun // Arg2 物品在包裹内的格子数
push 0 // Arg1 = 00000000
mov esi,$008D6498
mov esi,[esi+$20]
mov eax,$0056A670
call eax // \elementc.0056A670
popad
end;
end;然后调用UseItem(1727,1);
但是却汇编出错??(可以编译过去)但是直接在Button6Click中使用却不会出错,我觉得可能是传递参数出了错误,请问怎么解决
function UseItem(var Bag_itemId; Bmun: DWORD):single;
asm
pushad
push 1 // Arg4 = 00000001
push Bag_itemId // Arg3 物品ID
push Bmun // Arg2 物品在包裹内的格子数
push 0 // Arg1 = 00000000
mov esi,$008D6498
mov esi,[esi+$20]
mov eax,$0056A670
call eax // \elementc.0056A670
popad
end;
end;然后调用UseItem(1727,1);
但是却汇编出错??(可以编译过去)但是直接在Button6Click中使用却不会出错,我觉得可能是传递参数出了错误,请问怎么解决
asm
pushad
push 1 // Arg4 = 00000001
push Bag_itemId // Arg3 物品ID
push Bmun // Arg2 物品在包裹内的格子数
push 0 // Arg1 = 00000000
mov esi,$008D6498
mov esi,[esi+$20]
mov eax,$0056A670
call eax // \elementc.0056A670
popad
end;
把里面的参数(Bag_itemId,Bmun)改成实际值还是通不过,这样可能不是参数传递的问题了,难道是???
所以
push Bag_itemId // Arg3 物品ID
push Bmun // Arg2 物品在包裹内的格子数
应该不行。
你是说改成
push 立即数
也不行吗?
1、不同版本的delphi编译器,对于函数汇编出来的代码是不一样的,我曾经就碰到
过在delphi7能正常运行的ASM代码在delphi6下出错。建议你,认真核对函数对于参数
的调用规则;
2、TObject及类的调用与一般函数参数的调用又是不一样,对于TObject的代码还有虚拟
及动态装载的问题。
3、建议先使用delphi写的代码,再反汇编成汇编进行优化。由于代码不全,无法给出更多的建议
function UseItem(var Bag_itemId; Bmun: DWORD):single;
asm
...
end;
还是:
function UseItem(var Bag_itemId; Bmun: DWORD):single;
begin
asm
...
end;
end;
procedure UseItem(var Bag_itemId; Bmun: Integer);//Bag_itemId:物品ID;Bmun物品在包裹内的格子数(从0开始)
var
Bag_itemId_,Bmun_:Integer;
begin
Bag_itemId_:=Bag_itemId;
Bmun_:=Bmun;
asm
pushad
push 1 // Arg4 = 00000001
push Bag_itemId_ // Arg3 物品ID
push Bmun_ // Arg2 物品在包裹内的格子数(从0开始)
push 0 // Arg1 = 00000000
mov esi,lpmain
mov esi,[esi+$20]
mov eax,Address_useitem
call eax // \elementc.0056A670
popad
end;
end;
再用这个调用
procedure TFrm_Pop.ListBox1DblClick(Sender: TObject);
var
ItemId,ItemMum,Bag_main,Bag_max:Integer;
begin
Bag_main:=DuMem(base+$85c);
Bag_max:=DuMem(Bag_main+$10);
ItemMum:=ListBox1.ItemIndex;
ItemId:=DuMem(DuMem(DuMem(Bag_main+$C)+4*ListBox1.ItemIndex)+$8);
UseItem(ItemId,ItemMum);
end;
则出错定义procedure UseItem(var Bag_itemId; Bmun: Integer);
const lpmain=$008D6498 ; //基地址8D64B4-1C
const Address_useitem=$0056A670;
而在这里则不会出错
procedure TFrm_Pop.ListBox1DblClick(Sender: TObject);
var
Address:Pointer;
ItemId,ItemMum,Bag_main:Integer;
begin
Address:=Pointer($0056A670);
Bag_main:=DuMem(base+$85c);
ItemMum:=ListBox1.ItemIndex;
ItemId:=DuMem(DuMem(DuMem(Bag_main+$C)+4*ListBox1.ItemIndex)+$8);
asm
pushad
push 1 // Arg4 = 00000001
push ItemId // Arg3 物品ID
push ItemMum // Arg2 物品在包裹内的格子数(从0开始)
push 0 // Arg1 = 00000000
mov esi,lpmain
mov esi,[esi+$20]
lea ecx,[esi+$D4]
call Address // \elementc.0056A670
popad
end;
end;
Bag_itemId和Bmun才可以function UseItem(var Bag_itemId; Bmun: Integer): Single;//Bag_itemId:物品ID;Bmun物品在包裹内的格子数(从0开始)
asm
pushad
push 1 // Arg4 = 00000001
push Bag_itemId // Arg3 物品ID
push Bmun // Arg2 物品在包裹内的格子数(从0开始)
push 0 // Arg1 = 00000000
mov esi,lpmain
mov esi,[esi+$20]
lea ecx,[esi+$D4]
mov eax,$0056A670
call eax // \elementc.0056A670
popad
end;
push [Bag_itemId] // Arg3 物品ID
push Bmun // Arg2 物品在包裹内的格子数(从0开始)