我需要在 Delphi 中编写 asm 函数来搜索最大数组元素。所以那是我写的。这里有几个问题。
首先 -mov ecx, len
只是在这里以正确的方式工作。实际上它替换了 value inECX
但不是 value in len
!如果我只是写一个例子mov ecx, 5
,那么 ecx 中就会出现 5。
其次 - 我在 5 个元素的数组上测试这个函数(使用mov ecx, 5
ofc )它返回一些奇怪的结果。我想可能是因为我在尝试像这样读取数组 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.