Pascal, Assemblerunterprogramme und Rückgabewerte irecords.

Pascal, Assemblerunterprogramme und Rückgabewerte irecords.

Beitragvon Dosenware » Do 3. Nov 2016, 13:27

Grüße,

weiß jemand wie ich in einem Assemblerunterprogramm auf records vernünftig zugreifen kann?

Es geht um folgenden code:

Code: Alles auswählen
type testrecord=
   first:byte;
   second:byte;
end.

funtion testup(var test:testrecord):byte;assembler;
   asm
    mov dl,test.first {die Zeile wird vom Compiler bemängelt
   end.


Ich bin da grad etwas ratlos [] und ^ haben bisher nicht funktioniert.
Zuletzt geändert von Dosenware am Do 3. Nov 2016, 17:34, insgesamt 1-mal geändert.
Benutzeravatar
Dosenware
DOS-Gott
 
Beiträge: 3529
Registriert: Mi 24. Mai 2006, 19:29

Re: Pascal, Assemblerunterprogramme und Rückgabewerte ireco

Beitragvon Brueggi » Do 3. Nov 2016, 17:22

Spontan - ohne es probiert zu haben fällt mir ein

- Geht das denn, wenn du TEST vorher in ein lokalem Record ablegst?
- Geht das, wenn du nur die Adresse von TEST ermittelst (so das ADRESSE+1 auf Second zeigt)?

Irgendwie habe ich fast immer Probleme, wenn ich so etwas in der Art wie Du es möchtest, versuche, da dann die Werte aus dem ASM-Code "irgendwo" landen, aber nie in der Variable. :-)
Brueggi
 

Re: Pascal, Assemblerunterprogramme und Rückgabewerte ireco

Beitragvon DOSferatu » Do 3. Nov 2016, 17:23

test.first ist ein Byte. DX ist ein Word-Register. Vielleicht liegt's daran?
DOSferatu
DOS-Übermensch
 
Beiträge: 1095
Registriert: Di 25. Sep 2007, 11:05

Re: Pascal, Assemblerunterprogramme und Rückgabewerte ireco

Beitragvon Dosenware » Do 3. Nov 2016, 17:34

aso, ist bloß Pseudocode, im echten stimmen die Datentypen überein.

Den globalen und den lokalen Record kann ich problemlos beschreiben - das Problem liegt darin dass die Parameterübergabe per "var" geschieht, dadurch wird die Variable gewissermaßen zu einem Zeiger auf die eigentlichen Daten.
Lasse ich das var weg gehts problemlos - so kann das UP aber keine Werte zurückliefern...

Lasse ich im assemblercode das ".first" weg, kann ich auf die Variable zugreifen - aber eben nur auf den lokalen Zeiger, was mir ja nichts bringt, da ich auf die echte Variable und die einzelnen Bestandteile des Records zugreifen möchte.

PS. Obiger code wird mit "unbekannter Bezeichner" bemängelt.
Benutzeravatar
Dosenware
DOS-Gott
 
Beiträge: 3529
Registriert: Mi 24. Mai 2006, 19:29

Re: Pascal, Assemblerunterprogramme und Rückgabewerte ireco

Beitragvon wobo » Do 3. Nov 2016, 18:38

Wie Du schreibst, wird bei Verwendung des VAR-Parameters ein Pointer auf die übergebene(n) Variable(n) gebildet,

mov dl, test.first klappt daher nicht, da "test" nicht auf dem Stack liegt, sondern nur der Pointer auf "test"

Bei Übergabe mittels Var könntest Du daher auf das Feld "test.second" mittels

les di, test
mov dl, es:[di+1]

zugreifen bzw. es so adressieren (test.second liegt im 2. Byte des records; test.first läge im ersten also Mov dl,es:[di+0]).
wobo
DOS-Guru
 
Beiträge: 555
Registriert: So 17. Okt 2010, 13:40

Re: Pascal, Assemblerunterprogramme und Rückgabewerte ireco

Beitragvon Dosenware » Do 3. Nov 2016, 19:00

Hmm, das blöde daran ist, dass wenn ich irgendwann einmal den Record verändere (z.b. neben Int13h/AH=08h noch AH=48h einbaue) mir das ganze um die Ohren fliegt, weil sich dann nicht mehr der Compiler um die Adressen kümmert... :-/
Benutzeravatar
Dosenware
DOS-Gott
 
Beiträge: 3529
Registriert: Mi 24. Mai 2006, 19:29

Re: Pascal, Assemblerunterprogramme und Rückgabewerte ireco

Beitragvon wobo » Do 3. Nov 2016, 19:10

Dann musst Du den Compiler die Adressberechnungsarbeit machen lassen:

les di, test
mov dl, es:[di].testrecord.first
wobo
DOS-Guru
 
Beiträge: 555
Registriert: So 17. Okt 2010, 13:40

Re: Pascal, Assemblerunterprogramme und Rückgabewerte ireco

Beitragvon Dosenware » Do 3. Nov 2016, 19:13

:like: Danke, zumindest meckert der Compiler schoneinmal nicht :like:
Benutzeravatar
Dosenware
DOS-Gott
 
Beiträge: 3529
Registriert: Mi 24. Mai 2006, 19:29


Zurück zu Programmierung

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast