delphi 与 汇编(100分)

  • 主题发起人 主题发起人 moshengren
  • 开始时间 开始时间
M

moshengren

Unregistered / Unconfirmed
GUEST, unregistred user!
delphi 写的一个 dll,内有一函数类似,该函数有较多的局部变量,delphi格式是这样子的:

function xxx: Integer;stdcall
var
x1: integer;
x2: integer;
.......
begin
.......
end;

没想到,反汇编一看,一般我所知道局部变量申请都是类似 sub esp, 1C //按变量数确定

可是delphi并不都是这样,这次的结果是这样:


mov ecx,6
@loop:
push ecx
dec ecx
test ecx,ecx
jnz @loop

//居然是这样申请栈的,我的天啊,正好ecx我是其他函数传进来要利用的,这下全被搞乱了


大家有没有办法让delphi强制使用 sub esp, 1C 这样去编译阿
 
关键看stdcall这种调用参数声明的关键字。
去搜搜stdcall fastcall等?
 
一个integer,和ecx是一样大的
push ecx,这样申请空间比sub esp 会快很多!
把delphi的最优化关了,应该会是sub esp!
不然把数据类型改一下应该也可以的!
另外,我自己想了一下,用默认的,传参数的方法!是寄存器传参的,
参数为三个时,刚好会用到ecx,delphi应该也不会用push ecx的方式了,大不了,传没有用的参数呗!
 
delphi 的优化编译和 register 调用方式所致,取消即可
 
后退
顶部