Seite 1 von 1

Pascal, Assemblerunterprogramme und Rückgabewerte irecords.

Verfasst: Do 3. Nov 2016, 13:27
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.

Re: Pascal, Assemblerunterprogramme und Rückgabewerte ireco

Verfasst: Do 3. Nov 2016, 17:22
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. :-)

Re: Pascal, Assemblerunterprogramme und Rückgabewerte ireco

Verfasst: Do 3. Nov 2016, 17:23
von DOSferatu
test.first ist ein Byte. DX ist ein Word-Register. Vielleicht liegt's daran?

Re: Pascal, Assemblerunterprogramme und Rückgabewerte ireco

Verfasst: Do 3. Nov 2016, 17:34
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.

Re: Pascal, Assemblerunterprogramme und Rückgabewerte ireco

Verfasst: Do 3. Nov 2016, 18:38
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]).

Re: Pascal, Assemblerunterprogramme und Rückgabewerte ireco

Verfasst: Do 3. Nov 2016, 19:00
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... :-/

Re: Pascal, Assemblerunterprogramme und Rückgabewerte ireco

Verfasst: Do 3. Nov 2016, 19:10
von wobo
Dann musst Du den Compiler die Adressberechnungsarbeit machen lassen:

les di, test
mov dl, es:[di].testrecord.first

Re: Pascal, Assemblerunterprogramme und Rückgabewerte ireco

Verfasst: Do 3. Nov 2016, 19:13
von Dosenware
:like: Danke, zumindest meckert der Compiler schoneinmal nicht :like: