假设我有这样的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-skills
b)我必须为学校做这件事,并希望让它变得不那么无聊
答案 0 :(得分:7)
要做的第一件事是停止按值传递数组。对于大型阵列,这将是低效的。将参数声明为const
,而不是按值传递。
但是,由于您的函数名为sortArray
,并且由于您的代码尝试修改数组,因此您更有可能需要var
参数来获取所需的语义。
procedure sortArray(var arr: array of DWORD);
开放阵列的ABI记录在语言指南的Program Control主题中。它声明:
open-array参数作为两个32位值传递。第一个值是指向数组数据的指针,第二个值是一个小于数组中元素数的值。
所以,你的功能实际上与:
相同procedure sortArray(ArrPtr: PDWORD; ArrHigh: Integer);
从那里,你只需要理解调用约定,再次记录在语言指南的Program Control主题中:
符合条件的前三个参数按顺序在EAX,EDX和ECX寄存器中传递。
因此,ArrPtr
传递EAX
,ArrHigh
传递EDX
。