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

Gri*_*u47 4 delphi assembly delphi-7 inline-assembly calling-convention

假设我有这样的delphi函数:

procedure sortArray(arr: array of DWORD); register;
asm
  //access array here
end;
Run Code Online (Sandbox Code Playgroud)

如何在内联汇编中访问数组的特定元素?我已经知道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;
Run Code Online (Sandbox Code Playgroud)

顺便说一句.如果有人想知道:我在集会中这样做是因为

a)我想提高我的asm技能

b)我必须为学校做这件事,并希望让它变得不那么无聊

Dav*_*nan 7

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

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

procedure sortArray(var arr: array of DWORD);
Run Code Online (Sandbox Code Playgroud)

开放阵列的ABI记录在语言指南的程序控制主题中.它指出:

open-array参数作为两个32位值传递.第一个值是指向数组数据的指针,第二个值是小于数组中元素数量的值.

所以,你的功能实际上与:

procedure sortArray(ArrPtr: PDWORD; ArrHigh: Integer);
Run Code Online (Sandbox Code Playgroud)

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

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

因此,ArrPtr传入EAX,并ArrHigh传入EDX.

  • 当然,需要认识到,如果在参数列表中找到"X"数组,则只能是*open数组参数*.我写了一篇关于这个的文章(无耻地插入):[打开数组参数和const数组](http://rvelthuis.de/articles/articles-openarr.html). (2认同)