내가하고 싶은 것은 어셈블리를 사용하여 클래스 인스턴스를 만들고 그 중 하나를 호출 한 다음 인스턴스를 해제하는 것입니다.델파이 인라인 어셈블러를 사용하여 클래스 인스턴스 만들기
나는 매우 중요한 무엇인가를 놓치고 있고 아마도 매우 간단하다는 것을 알고있다. 그러나 나는 무엇을 모른다.
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TSomeClass = class(TObject)
private
FCreateDateTime: string;
public
constructor Create;
procedure SayYeah;
end;
constructor TSomeClass.Create;
begin
FCreateDateTime := DateTimeToStr(Now);
end;
procedure TSomeClass.SayYeah;
begin
Writeln('yeah @ ' + FCreateDateTime);
end;
procedure Doit;
asm
CALL TSomeClass.Create; // <= Access Violation
CALL TSomeClass.SayYeah;
CALL TSomeClass.Free;
end;
begin
try
Doit;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
FYI : 나는 이것을 낮은 수준에서 어떻게 달성 할 수 있는지, 다른 방법으로는 이해할 수 없다는 것을 알고 싶습니다.
UPDATE : 오히려 PUSH보다, EBX를 사용하여 결함을 찾기위한 아르노에
감사 :
갱신 2 : 안드레아스 Rejbrand에
덕분에, 나는 범인을 찾기 위해 관리했습니다/POP EAX
var
TSomeClass_TypeInfo: Pointer;
procedure Doit;
asm
MOV DL, $01;
MOV EAX, TSomeClass_TypeInfo;
CALL TSomeClass.Create;
PUSH EAX;
CALL TSomeClass.SayYeah; // call method
POP EAX;
MOV DL, $01;
CALL TSomeClass.Free; // pointer to instance(Self) is expected in EAX
end;
begin
TSomeClass_TypeInfo := TSomeClass;
try
Doit;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
EBX는 저장해야합니다 - Arnaud의 대답을보세요 – PhiS
@PhiS 예 선생님, Arnaud의 답변을 읽었습니다. 누구에게나 관심이있는 사용자는 모든 답변 (2 개만 읽음)과 댓글 (: – ComputerSaysNo
)을 읽습니다. 당신이 EBX를 저장하지 않고 사용하고있는 질문에 대한 당신의 업데이트에서 이런 함수를 사용하는 실제 프로그램이 충돌을 일으킬 위험이 있기 때문에이를 수정하십시오 (eg ebx/pop ebx를 푸시하십시오) 그 이유는 찾기가 매우 어려울 것입니다 ... – PhiS