priorovod

Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Вопрос по asm используемом в delphi 2009. Необходимо реализовать вставку кода на асме в дельфи. Для этого в delphi вызываю функцию написанную на асм, в которую надо передать два числа: Код: procedure TForm1.Button1Click(Sender: TObject); var x,y,i: integer; dat: string; begin y:=0; dat:=Edit1.Text; //"12345" for i := 1 to length(dat) do begin x:=ord(dat[i]); y:=iter1(x,y); //та самая функция end; showmessage(inttostr(x+y)); end; function iter1(x,y: integer): integer; label lb1,lb2,lb3; asm shl eax, 8 xor edx, eax lb1: test dh,$80 je lb2 add edx, edx xor edx, $8021 jmp lb3 lb2: add edx,edx lb3: dec eax jnz lb1 and edx,$0FFFF mov eax, edx end; | Проблема в следующем, делфи передает x и y в функцию iter1 через регистры eax и edx соответственно. Насколько я усвоил из найденных примеров, возврат результирующего значения функции осуществляется так же через регистр eax. При просмотре скомпилированного кода отладчиком, вызываемая функция работает верно, но перед возвратом retn компилятор дописывает mov eax, ecx. Т.е.: Вызов функции осуществляется так: Код: Unit1.pas.55: x:=ord(dat[i]); 0046E3DB mov eax,[ebp-$04] 0046E3DE mov edx,[ebp-$08] 0046E3E1 movzx edi,[eax+edx*2-$02] Unit1.pas.56: y:=iter1(x,y); 0046E3E6 mov edx,ebx 0046E3E8 mov eax,edi 0046E3EA call iter1 0046E3EF mov ebx,eax 0046E3F1 inc dword ptr [ebp-$08] Unit1.pas.53: for i := 1 to length(dat) do 0046E3F4 dec esi 0046E3F5 jnz $0046e3db | Сама функция: Код: 0046E358 shl eax,$08 0046E35B xor edx,eax 0046E35D test dh,$80 0046E360 jz $0046e36c 0046E362 add edx,edx 0046E364 xor edx,$00008021 0046E36A jmp $0046e36e 0046E36C add edx,edx 0046E36E dec eax 0046E36F jnz $0046e35d 0046E371 and edx,$0000ffff 0046E377 mov eax,edx 0046E379 mov eax,ecx 0046E37B ret | Регистр ecx в ходе вычислений здесь вообще не задействован и каждый раз процедура выдает одно и тоже значение. Может кто подскажет, как правильно вызывать описанную функцию и что я делаю неправильно? |