假设我有一个像这样的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.
因此,ArrPtr
在 EAX
中传递,ArrHigh
在 EDX
中传递。
关于delphi - 如何在内联汇编中访问delphi开放数组参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26218034/