का उपयोग करके कक्षा उदाहरण बनाएं, मैं क्या करना चाहता हूं, असेंबली का उपयोग करके, क्लास इंस्टेंस बनाएं, इसके तरीकों में से एक को कॉल करें और फिर इंस्टेंस को मुक्त करें।डेल्फी इनलाइन असेंबलर
मुझे पता है कि मुझे कुछ बहुत महत्वपूर्ण और शायद बहुत आसान याद आ रही है, लेकिन मुझे नहीं पता कि क्या।
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 करें: मैं समझता हूँ कि कैसे मैं इसे करने का एक और तरीका है निम्न स्तर पर इस लक्ष्य को हासिल कर सकते हैं, चाहते हैं।
अद्यतन:, बल्कि PUSH से
EBX का उपयोग कर दोष खोजने के लिए अरनॉड के लिए धन्यवाद:
Update2:
एंड्रियास Rejbrand के लिए धन्यवाद, मैं अपराधी को खोजने के प्रबंधित किया है/पीओपी ईएक्स
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 बचाया जा करने की जरूरत है -, अरनॉड का जवाब – PhiS
@PhiS हाँ महोदय, मैं अरनॉड का जवाब, जिसे इस में रुचि रखता है पढ़ा है पर एक नजर है सभी उत्तर (केवल 2) और टिप्पणियां (पढ़ा जाएगा: – ComputerSaysNo
बात है कि प्रश्न के आपके अपडेट में आप इसे सहेजने के बिना ईबीएक्स का उपयोग कर रहे हैं। कृपया इसे ठीक करें (उदाहरण के लिए पुश ईबीएक्स/पॉप ईबीएक्स), क्योंकि यदि आप जोखिम नहीं चलाते हैं तो ऐसे फ़ंक्शन का उपयोग करने वाला वास्तविक प्रोग्राम बस क्रैश हो सकता है - और इसके लिए कारण खोजना बहुत मुश्किल होगा ... – PhiS