Pascal, Pchar und asm

Diskussion zum Thema Programmierung unter DOS (Intel x86)
Antworten
Benutzeravatar
Dosenware
DOS-Gott
Beiträge: 3745
Registriert: Mi 24. Mai 2006, 20:29

Pascal, Pchar und asm

Beitrag von Dosenware »

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? x./^ und @ werden auch nicht genommen

Edit: Hmm, [] nimmt er - mal schauen obs auch richtig ist - nope da kommt wohl was anderes raus
String2.[0] tuts auch nicht und Pointer PTR String2 ebenfalls nicht.

Jetzt gehts, scheint wohl irgendwelche diffusen Probleme mit typisierten Zeigern zu haben...

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; {?????}
...
wobo
DOS-Guru
Beiträge: 614
Registriert: So 17. Okt 2010, 14:40

Re: Pascal, Pchar und asm

Beitrag von wobo »

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.
Benutzeravatar
Dosenware
DOS-Gott
Beiträge: 3745
Registriert: Mi 24. Mai 2006, 20:29

Re: Pascal, Pchar und asm

Beitrag von Dosenware »

Ahh, danke.
Antworten