32Bit in 16Bit Assembler (in Pascal)

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

32Bit in 16Bit Assembler (in Pascal)

Beitrag von Dosenware »

Grüße,

ich bastel grad an einem Programm in dem ich 32bitig auf einen 32Bit Port schreiben und lesen muss. (konkret sind es $CF8 und $CFC)

Jetzt die Frage:
Wie bekomme ich das mit dem intigrierten Assembler von BP7 hin?
Gibt es eine Möglichkeit ein 32Bit Register mit 16 Bit Registern/Werten zu füllen/lesen (quasi AX=mov ah,bl + mov al,cl )?
Oder muss ich über den Speicher gehen? Wie Adressiere ich dann eine Variable?

Afair ging da was mit Hilfe von "db".

PS. eine Testmöglichkeit, ob der Prozessor 32bit fähig ist wäre auch super.

Vielen Dank schoneinmal.
mkarcher
LAN Manager
Beiträge: 204
Registriert: Fr 5. Jun 2020, 19:38

Re: 32Bit in 16Bit Assembler (in Pascal)

Beitrag von mkarcher »

Wenn Du in die Zeile vor "out dx,ax" eine Zeile "db 66h" einfügst, mutiert der Out-Befehl out "out dx,eax".

Das gleiche gilt für shl und shr, also (ungetestet):

Code: Alles auswählen

Procedure Out32(Port: Word; Value: Longint); Assembler;
asm
  mov dx, [port]
  mov ax, [value + 2]
  db 66h
  shl ax, 16
  mov ax, [value]
  db 66h
  out dx,ax
end;

Function In32(Port: Word) : Longint; Assembler;
asm
  mov dx, [port]
  db 66h
  in ax, dx
  db 66h
  mov dx,ax
  db 66h
  shr dx,16
end;
mkarcher
LAN Manager
Beiträge: 204
Registriert: Fr 5. Jun 2020, 19:38

Re: 32Bit in 16Bit Assembler (in Pascal)

Beitrag von mkarcher »

Und für die Erkennung des Prozessortyps, wirf einen Blick auf https://swag.outpostbbs.net/HARDWARE/0013.PAS.html
Benutzeravatar
Dosenware
DOS-Gott
Beiträge: 3745
Registriert: Mi 24. Mai 2006, 20:29

Re: 32Bit in 16Bit Assembler (in Pascal)

Beitrag von Dosenware »

Vielen lieben Dank :like:
Benutzeravatar
Dosenware
DOS-Gott
Beiträge: 3745
Registriert: Mi 24. Mai 2006, 20:29

Re: 32Bit in 16Bit Assembler (in Pascal)

Beitrag von Dosenware »

Grüße,

nächste Frage:

Code: Alles auswählen

type x=Record
 long:longint;
 wordarr:array[0..1]of word;absolute long;
 bytearr:array[0..3]of byte;absolute x.long;
 long2:longint absolute long;
 long3:longint absolute x.long;
end;
Alle 4 Varianten mag der Compiler leider nicht, Ideen wie sich das umsetzen lässt?

/Grüße
mkarcher
LAN Manager
Beiträge: 204
Registriert: Fr 5. Jun 2020, 19:38

Re: 32Bit in 16Bit Assembler (in Pascal)

Beitrag von mkarcher »

Was Du willst is das, was in C eine union ist, und das macht man in Pascal mit einer Fallunterscheidung via "case" im Record. Ursprünglich mal so gedacht:

Code: Alles auswählen

type x = Record
  case selector:integer of
   1: (l : LongInt);
   2: (wa : array[0..1] of word);
end;
wobei es dann ein Element "selector" gibt, und wenn es 1 ist, dann sollst Du in l nach einem Longint gucken, wogegen wenn es 2 ist, sollst Du in was nach 2 Words gucken. Die Regeln, wann welches Element gültig ist, werden vom Compiler aber nicht durchgesetzt, so dass Du auch auf l und wa zugreifen kannst, selbst wenn selector weder 1 noch 2 ist. Und deshalb ist das Selektor-Feld an sich auch nicht zwingend, so dass auch folgendes geht:

Code: Alles auswählen

type x = Record
  case integer of
   1: (l : LongInt);
   2: (wa : array[0..1] of word);
end;
In diesem Fall ist die Syntax sehr ähnlich zum obigen Fall, nur dass das Selektorfeld entfällt, wenn man ihm keinen Namen gibt. Dann macht es eigentlich auch keinen Sinn, einen Typ dafür und Werte dafür anzugeben, aber so ist die Syntax halt.
Benutzeravatar
Dosenware
DOS-Gott
Beiträge: 3745
Registriert: Mi 24. Mai 2006, 20:29

Re: 32Bit in 16Bit Assembler (in Pascal)

Beitrag von Dosenware »

Jupp, funktioniert - auch wenn es schade ist das der Compiler die "absolute" Variante nicht mag, da wäre dann die Syntax wenigstens einheitlich und würde mehrere "Universalspeicher" zulassen.
Antworten