【问题标题】:How to access delphi open array parameter in inline assembly如何访问内联汇编中的delphi开放数组参数
【发布时间】:2014-10-06 14:05:56
【问题描述】:

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

procedure sortArray(arr: array of DWORD); register;
asm
  //access array here
end;

如何访问内联汇编中数组的特定元素?我已经知道 arr 实际上由 2 个参数组成:指向数组的指针及其 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) 我必须为学校做这件事,并且想让它变得不那么无聊

【问题讨论】:

  • 您可以在使用 CPU 调试窗口时自行确定。
  • 我不是试错学习的忠实粉丝。阅读文档应该是第一步。为什么要求助于逆向工程?

标签: delphi assembly delphi-7 inline-assembly calling-convention


【解决方案1】:

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

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

procedure sortArray(var arr: array of DWORD);

开放数组的 ABI 记录在语言指南的 Program Control 主题中。它指出:

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

因此,您的功能实际上与以下内容相同:

procedure sortArray(ArrPtr: PDWORD; ArrHigh: Integer);

从那里,您只需要了解调用约定,再次记录在语言指南的 Program Control 主题中:

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

所以,ArrPtr 传入EAXArrHigh 传入EDX

【讨论】:

  • 谢谢,但你确定 ArrHigh 实际上是一个德尔福整数吗?由于元素的数量永远不会是负数,我认为它宁愿是一个无符号的 32 位 int,因此是一个 DWORD/CARDINAL。该文档没有说明它是否已签名。你能告诉我这条线是否正确吗? mov DWORD PTR [eax+$4], $09 //set the second element of arr to 9 ???
  • @Cody227 元素的数量永远不能是负数。那是真实的。但是ArrHigh 不是元素的数量。它是最后一个元素的索引。所以,High(arr) = Length(arr)-1。而当没有元素时,HighArr 为 -1。所以是的,第二个参数是有符号的。
  • 是的,mov DWORD PTR [eax+$4], $09 会将$9 分配给第二个元素。当然,您需要检查实际代码中是否真的存在第二个元素。
  • 当然,需要意识到array of X,如果在参数列表中找到,只能是一个开放数组参数。我为此写了一篇文章(无耻地插入):Open array parameters and array of const.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多