delphi - 如何在内联汇编中访问delphi开放数组参数

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

假设我有一个像这样的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)我必须为学校做这个,并且想让它不那么无聊

最佳答案

要做的第一件事是停止按值传递数组。对于大型数组来说,这将是低效的。不要按值传递,而是将参数声明为 const。

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

procedure sortArray(var arr: array of DWORD);

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

An open-array parameter is passed as two 32-bit values. The first value is a pointer to the array data, and the second value is one less than the number of elements in the array.

因此,您的函数实际上与:

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

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

The first three parameters that qualify are passed in the EAX, EDX, and ECX registers, in that order.

因此,ArrPtrEAX 中传递,ArrHighEDX 中传递。

关于delphi - 如何在内联汇编中访问delphi开放数组参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26218034/

相关文章:

Delphi:设置为自动隐藏时如何显示托盘图标气球而不显示任务栏

c++ - 如何使用 localtime() 获取 Arm ASM 中的当前时间?

c - 我怎样才能组装这个程序

delphi - 如何解决DSServerModule1.ClientHeight : Property does not exist error

delphi - 如何在Delphi应用程序中调用APPPCRASH事件?

delphi - 打印时出现 "Operation not supported"和 "Printer selected is not valid"错误

c - 表示已知大小变量的表达式结果的最少位数?

delphi - 在 TThread 内创建窗口

delphi - 如何将备忘录保存为 unicode

delphi - 如何以编程方式更改计算机的网络设置?