Moin!
Zitat von
Capable:
1. Frage
Delphi-Quellcode:
procedure PortOut(x:byte);
begin
asm //erklärt dem Compiler, dass Assembler Code anfängt
mov [b]dx[/b],378h
//378h ist die Adresse von LPT 1
mov al,x
//x müssen wir noch einen Wert zuweisen
out [b]dx[/b],al
end;
end;
wieso wird hier zwei mal
dx verwendet?
hier hingegen nicht
Delphi-Quellcode:
// Werte holen aus dem Register des Ports (NUR UNTER WINDOWS 9X)
asm
mov dx, Port
// 1. Verwendung DX DX mit der Portadresse laden/füllen
in al, dx
// 2. Verwendung DX ein Byte von dem Port in DX auslesen und in AL schreiben
Mov Value, AL
// und AL in die Variable Value schreiben
end;
Wieso? Wird es doch auch?
Zitat von
Capable:
2. Frage
muss hier nicht hinter das port ein Out?
Ja, muss. Es wird anscheinend PortOut() angesprochen und ein Port() gibt es nicht.
Zitat von
Capable:
3. Frage
... wird hier port nicht zwei mal deklariert, bzw. der integer zugeordnet? (delphi meint: redeclaration...)
Ja, die Deklaration von Value und Port macht an der Stelle überhaupt keinen Sinnn - entferne sie einfach beide.
Zitat von
Capable:
4. Frage
bedeutet $378 das gleiche wie 378h ?
Ja, 378h bedeutet das gleiche wie $378. Wenn du in Delphi Zahlen ohne irgendwas angibst, so sind es dezimale Zahlen. Mit dem $ davor werden die Zahlen danach als hexadezimale Zahlen gewertet. Dies gilt für Delphi und Pascal - in C z.B. müsste man ein 0x vor der Zahl schreiben - aber da es so viele Sprachen gibt, gibt es auch eine allgemeine Schreibweise die einfach hinter der Zahl einen Buchstaben angibt um eine bestimmte Schreibweise zu kennzeichnen:
h = hexadezimal
d = dezimal
o = oktal
b = binär
Dies wird z.B. direkt so vom Turbo Assembler von Borland verwendet.
Zitat von
Capable:
5. Frage
muss ich bei LPT2 einfach die drei jeweils durch die 2 austauschen? also,
378 --> 278
379 --> 279
37A --> 27A
Nein, das ist nicht gesagt. Die Reihenfolge der LPT Ports und deren Adressen hängt vor allem davon ab wie sie gefunden werden vom BIOS bzw. von Windows. Parallelports können auf den folgenden Adressen zu finden sein:
3BCh, 378h, 278h und PCI Portadressen (also Portadressen > 1000h)
Bei den meisten Rechnern wo ein 2. Parallelport mit einer ISA Karte nachgerüstet ist, da wird es 278h sein. Bei solchen wo eine MDA Karte mit drinne steckt, da wird es 3BCh sein.
Zitat von
Capable:
6. Frage
wie kann ich den Wert der Variable Port aus word in einen string umwandeln und in einer showmessage darstellen?
In welcher Darstellungsform? Als Hexadezimalzahl oder als Dezimalzahl?
Delphi-Quellcode:
Begin
ShowMessage('Portadresse: ' + IntToHex(Port, 3) + ' hexadezimal' + #13#10 +
'Portadresse: ' + IntToStr(Port) + ' dezimal');
End;
Zitat von
Capable:
7. Frage
Code:
// Werte holen aus dem Register des Ports (NUR UNTER WINDOWS 9X)
asm
mov dx, Port
[b]in al, dx[/b]
Mov Value, AL
end;
wieso heißt es nicht
in dx,al
Weil es so ist bei einem x86 kompatiblen Assembler und hier im Syntax von Borland. Hier ist es so festgelegt, das als erstes immer das Ziel einer Operation und danach die Quelle angegeben wird.
Code:
In Ziel, Quelle einlesen, also ins Ziel schreiben und vom Port lesen
Out Ziel, Quelle schreiben, also in den Port schreiben.
Genauso bei Move:
Code:
mov Ziel, Quelle
mov dx, $378
Zitat von
Capable:
8. Frage
wieso verwendet man eine funktion und keine prozedur?
Weil eine Funktion einen Rückgabewert hat im Gegensatz zu einer Procedure. Daher gibt das PortIn() auch was zurück (den eingelesenen Wert) und PortOut() besteht aus einer Procedure, weil es nichts zurück gibt.
Den anderen Teil der 8. Frage kann dir ein anderer erklären - war genug erstmal für mich.
@flomei:
Erklär mal bitte auch, das es eine Basisadresse gibt und dann die Register immer nur ein fester Offset von dieser Basisadresse ist.
MfG
Muetze1