如何在内联汇编中访问delphi open array参数

如何在内联汇编中访问delphi open array参数,delphi,assembly,delphi-7,inline-assembly,calling-convention,Delphi,Assembly,Delphi 7,Inline Assembly,Calling Convention,假设我有这样一个delphi函数: procedure sortArray(arr: array of DWORD); register; asm //access array here end; 如何访问内联程序集中数组的特定元素?我已经知道arr实际上由两个参数组成:一个指向数组的指针和它的High(),但我需要确切地知道它是如何工作的。我假设指针在eax中,高值在ebx中,但我不太确定 procedure sortArray(arr: array of DWORD); registe

假设我有这样一个delphi函数:

procedure sortArray(arr: array of DWORD); register;
asm
  //access array here
end;
如何访问内联程序集中数组的特定元素?我已经知道arr实际上由两个参数组成:一个指向数组的指针和它的High(),但我需要确切地知道它是如何工作的。我假设指针在eax中,高值在ebx中,但我不太确定

procedure sortArray(arr: array of DWORD); register;
asm
  mov DWORD PTR [eax+$4], $09 //set the second element of arr to 9 ???
end;
顺便说一句,如果有人想知道的话:我在组装中这样做是因为

a) 我想提高我的asm技能


b) 我必须为学校做这件事,并想让它少一点无聊

首先要做的是停止按值传递数组。对于大型阵列,这将是低效的。将参数声明为
const
,而不是按值传递

但是,由于您的函数名为
sortArray
,并且由于您的代码试图修改数组,因此更可能需要
var
参数来获得所需的语义

procedure sortArray(var arr: array of DWORD);
《语言指南》的主题中记录了开放数组的ABI。它指出:

开放数组参数作为两个32位值传递。第一个值是指向数组数据的指针,第二个值比数组中的元素数少一个

因此,您的功能实际上与:

procedure sortArray(ArrPtr: PDWORD; ArrHigh: Integer);
从这里开始,您只需要理解调用约定,同样记录在《语言指南》的主题中:

符合条件的前三个参数按顺序传递到EAX、EDX和ECX寄存器中


因此,
ArrPtr
EAX
中传递,而
arrhig
EDX
中传递,您可以在使用CPU调试窗口时自行确定。我不太喜欢尝试和错误学习。阅读文档应该是第一步。为什么要求助于逆向工程?谢谢,但你确定arrhaigh实际上是一个delphi整数吗?由于元素的数量永远不能是负数,我认为它应该是一个无符号的32位int,因此是一个DWORD/基数。文档中没有说明是否有签名。你能告诉我这句话是否正确吗
mov DWORD PTR[eax+$4],$09//将arr的第二个元素设置为9??
@Cody227元素数不能为负。这是真的。但是
ArrHigh
不是元素的数量。它是最后一个元素的索引。因此,
High(arr)=Length(arr)-1
。当没有元素时,
HighArr
为-1。因此,是的,第二个参数是有符号的。是的,
mov DWORD PTR[eax+$4],$09
$9
分配给第二个元素。当然,您需要检查实际代码中是否存在第二个元素。当然,您需要意识到,如果在参数列表中找到X的数组,则只能是一个打开的数组参数。我写了一篇关于这件事的文章(无耻地插入):。