Dosenware hat geschrieben:Gruß,
habe grade ein kleines Problem mit dem Assembler von Bp7, folgendes Konstrukt:
Code: Alles auswählen
x:object
procedure y(String1:Pchar);
private String2:Pchar;
end;
procedure x.y(String1:PChar);
begin;
...
asm
les di, String1; {geht}
les di, String2; {geht nicht - ungültige Kombination aus Opcode und Operrand}
...
Warum bekomme ich String2 nicht geladen und wie gehts?
String1 geht, weil String1, bzw. genauer ein Pointer auf String1 auf dem Stack landet. Deswegen kannst Du diesen Pointer auch in es:di laden.
String2 ist Bestandteil des Objekts. Das Objekt liegt aber nicht auf dem Stack und auch nicht im Datensegment. Objekte liegen bei TP7/BP auf dem Heap. Da der Ort des Objekts ggf. erst zur Laufzeit bestimmt werden kann, stellen TP7, BP den Pointer "Self" zur Verfügung. Nachdem Du Dein Objekt mittels "Self" geladen hast, kannst Du dann den pChar String2 laden:
Code: Alles auswählen
x:object
procedure y(String1:Pchar);
private String2:Pchar;
end;
procedure x.y(String1:PChar);
begin;
...
asm
les di, String1; {geht}
les di, Self; {Object x laden}
les di, es:di.String2; {pointer string2 aus dem Object laden}
...
Dosenware hat geschrieben:
Code: Alles auswählen
x:object
procedure y(String1:Pchar);
private String2:Pchar;
end;
procedure x.y(String1:PChar);
var point:pointer;
begin;
point:=String2;
...
asm
les di, String1; {geht}
les di, Point; {?????}
...
Ist auch vollkommen korrekt, weil Du den Pointer String2 des Objekts lokal (d.h. auf dem Stack) in den Zwischenpuffer "point" kopierst. Deswegen kannst Du dann diesen Zeiger einfach nach es:di laden. Die Arbeit mit Self hat nämlich TP7, BP für Dich dann schon gemacht.