我需要在Delphi中编写汇编函数来查找最大的数组元素。以下是我的代码。但是出现了一些问题。
第一个问题是,
第二个问题是,我用包含5个元素的数组测试了这个函数(当然使用了
但如果我这样阅读它
操作无效,并且如果我这样尝试,它会提示。
第一个问题是,
mov ecx, len
在这里并没有按照正确的方式工作。实际上它只是替换了ECX
中的值,而不是用len
的值来替换。如果我写一个例子mov ecx, 5
,那么ecx中就会出现5。第二个问题是,我用包含5个元素的数组测试了这个函数(当然使用了
mov ecx, 5
),它返回了一些奇怪的结果。我认为这可能是因为我在尝试读取数组的0号元素时做了一些错误的操作,如下所示:mov edx, arr
lea ebx, dword ptr [edx]
但如果我这样阅读它
lea ebx, arr
操作无效,并且如果我这样尝试,它会提示。
lea bx, arr
提示尺寸不匹配。
我该如何解决这个问题?完整代码如下:
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
Type
TMyArray = Array [0..255] Of Byte;
function randArrCreate(len:Integer):TMyArray;
var temp:TMyArray; i:Integer;
begin
Randomize;
for i:=0 to len-1 do
temp[i]:=Random(100);
Result:= temp;
end;
procedure arrLoop(arr:TMyArray; len:Integer);
var i:integer;
begin
for i:=0 to len-1 do begin
Write(' ');
Write(arr[i]);
Write(' ');
end;
end;
function arrMaxAsm(arr:TMyArray; len:integer):Word; assembler;
asm
mov edx, arr
lea ebx, dword ptr [edx]
mov ecx, len
xor ax,ax //0
mov ax, [ebx] //max
@cycle:
mov dx, [ebx]
cmp dx, ax
jg @change
jmp @cont
@change:
mov ax, dx
@cont:
inc ebx
loop @cycle
mov result, ax
end;
var massive:TMyArray; n,res:Integer;
begin
Readln(n);
massive:=randArrCreate(n);//just create random array
arrLoop(massive,n);//just to show what in it
res:=arrMaxAsm(massive, n);
Writeln(res);
Readln(n);
end.
eax
,ecx
和edx
寄存器被称为“scratch”寄存器,您的代码可以自由使用它们,但其他寄存器用于实现细节,编译器期望它们的值不会改变 - 由于该函数使用bx
来存储临时值,因此必须包括此保存/恢复对。 - DCoder