最大配列要素を検索するには、Delphiでasm関数を作成する必要があります。だから私が書いたワット。ここでいくつかのprolbemを手に入れました。
まずmov ecx, len
、ここでは正しく機能しません。実際には、の値は置き換えられますが、 !ECX
の値は置き換えられません。len
そして、例を挙げればmov ecx, 5
、ecxに5が表示されます。
2番目-この関数を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.