Po zakończeniu funkcji w assemblerze zostaje zwrócona poprawna wartość, ale Delphi przestaje widzieć pozostałe zmienne.
Napisałem procedurę xor-ującą String-a.
function XorString(gText:String):String;
var
S1 : String;
B1 : Byte;
C1 : Char;
begin
S1:=gText;
B1:=0;
while B1&ltLength(S1) do
begin
Inc(B1);
C1:=S1[B1];
asm
MOV AL,C1
MOV AH,B1
XOR AL,AH
MOV C1,AL
end;
if (C1&gt=' ') and (C1&lt&gt#39) then
S1[B1]:=C1;
end;
XorString:=S1;
end;
Działa poprawnie, ale chciałem, żeby cała była w assemblerze, więc napisałem w assemblerze.
function XorAsm(gStr: PChar): PChar; assembler;
asm
PUSH ESI
PUSH EBX
MOV ESI,gStr
MOV EDX,gStr
MOV AH,1
@@1: LODSB {wczytaj do AL kolejny znak}
OR AL,AL
JE @@3 {zero - to zakończ}
MOV BL,AL
XOR AL,AH
INC AH
CMP AL,31
JA @@2 {gdy powyżej znaku o kodzie 31}
MOV AL,BL
XOR AL,1 {gdy znak 31 lub niżej}
@@2: MOV [ESI-1],AL {zapisz zmieniony znak}
JMP @@1
@@3: XCHG EAX,EDX
POP EBX
POP ESI
end;
I jak napisałem u góry procedura działa poprawnie, zwraca też dobrą wartość, ale po jej zakończeniu Delphi przestaje widzieć pozostałe zmienne. Pewnie to jakiś drobiazg (już słyszę śmiechy). Trzeba coś jeszcze za-PUSH-ować czy należy dodać dyrektywę FAR czy coś podobnego. Proszę o pomoc.
[email protected] :[[