Pascal, Assemblerunterprogramme und Rückgabewerte irecords.

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

Pascal, Assemblerunterprogramme und Rückgabewerte irecords.

Beitrag von Dosenware »

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.
Brueggi

Re: Pascal, Assemblerunterprogramme und Rückgabewerte ireco

Beitrag von Brueggi »

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. :-)
DOSferatu
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: Pascal, Assemblerunterprogramme und Rückgabewerte ireco

Beitrag von DOSferatu »

test.first ist ein Byte. DX ist ein Word-Register. Vielleicht liegt's daran?
Benutzeravatar
Dosenware
DOS-Gott
Beiträge: 3745
Registriert: Mi 24. Mai 2006, 20:29

Re: Pascal, Assemblerunterprogramme und Rückgabewerte ireco

Beitrag von Dosenware »

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

Re: Pascal, Assemblerunterprogramme und Rückgabewerte ireco

Beitrag von wobo »

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

Re: Pascal, Assemblerunterprogramme und Rückgabewerte ireco

Beitrag von Dosenware »

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... :-/
wobo
DOS-Guru
Beiträge: 613
Registriert: So 17. Okt 2010, 14:40

Re: Pascal, Assemblerunterprogramme und Rückgabewerte ireco

Beitrag von wobo »

Dann musst Du den Compiler die Adressberechnungsarbeit machen lassen:

les di, test
mov dl, es:[di].testrecord.first
Benutzeravatar
Dosenware
DOS-Gott
Beiträge: 3745
Registriert: Mi 24. Mai 2006, 20:29

Re: Pascal, Assemblerunterprogramme und Rückgabewerte ireco

Beitrag von Dosenware »

:like: Danke, zumindest meckert der Compiler schoneinmal nicht :like:
Antworten