PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Werte in ah laden


MarcoD
23.08.2004, 14:03
Warum funktioniert das nur bei DOS-Interrupts(z.B. mov ah,04ch) und ansonsten nicht? TASM meldet dann einen Fehler: Must be AX or AL.Ist das ein Bug bei TASM?


Felix Kaiser
23.08.2004, 18:11
Und jetzt bitte nochmal mit Zusammenhang und Quelltext.

MarcoD
23.08.2004, 20:43
Und jetzt bitte nochmal mit Zusammenhang und Quelltext.Hi,

Hab' die Lösung schon gefunden.Bei OUT muß es wohl zwingend AX oder AL sein.Warum das nicht auch AH sein kann,wird allerdings nicht erklärt. :)

Scavi
23.08.2004, 20:47
Warum das so ist? Denk mal kurz darüber nach, dann kommste selber drauf!

MarcoD
24.08.2004, 03:43
Warum das so ist? Denk mal kurz darüber nach, dann kommste selber drauf!
Ich tippe mal auf den "Intel Inside",der es einfach nicht kann.

Felix Kaiser
24.08.2004, 20:50
Du hättest wenigstens mal am Anfang erwähnen können, dass du auf E/A Ports zugreifen wolltest, hätte geklärt werden können durch eine Quellzeile, anstatt irreführendes Umschreiben. Es ist einfach eine Festlegung dass Werte nur aus oder in die Register AL, AX oder EAX gelesen oder geschrieben werden können. Das hat mit Interrupts garnichts zu tun. Das sind Zugriffe auf E/A Ports. Was du gepostet hast war eine direkte Wertzuweisung in das AH Register.

MarcoD
24.08.2004, 22:59
Die Fehlermeldung von TASM bezog sich nicht auf das "mov ah,wert" ,sondern auf die Zeile darunter mit dem OUT Befehl.Brauche wohl mal ne Brille.:cool:

Man darf wohl an die Schaltungslogik der 8086 CPU keine zu großen Ansprüche stellen.;) Hier hat man sich wohl zusätzliche Bauelemente gespart,die OUT auch mit dem AH-Register ermöglicht hätten. Die CPU war wohl eh ne Spar-CPU,der 68k war wohl besser und hatte auch mehr Register(viele Register sind doch eher positiv,oder?).

Scavi
25.08.2004, 11:31
AH geht nicht, weil es sinnlos wäre wenn es ginge. Ausserdem muss man ja auch "Drähte" sparen. Muss man denn ein höherwertiges (als Zahl gemeint) Register ausgeben können? Vorallem was solllte das bedeuten? Bedeutet dies, das AL dann mit 0 gefüllt wäre oder bedeutet dies, das AH eine untere 8bit Zahl wäre? Was ja eigentlich AL ist? Denk mal darüber nach! Es wäre irrsinnig, wenn AH bei out ginge. ...Viele Register ist nicht immer positiv. Es gibts Risc und Cisc-Prozessoren, die einen haben wenig, die anderen viele Register. Alle haben ihre Bedeutung und Einsatzgebiete. Also kann man das nicht pauschalisieren.

MarcoD
25.08.2004, 13:29
AH geht nicht, weil es sinnlos wäre wenn es ginge. Ausserdem muss man ja auch "Drähte" sparen. Muss man denn ein höherwertiges (als Zahl gemeint) Register ausgeben können?Über DX gibt man ja auch das höherwertige Byte von DX aus,z.B. Port 65535.



Vorallem was solllte das bedeuten? Bedeutet dies, das AL dann mit 0 gefüllt wäre oder bedeutet dies, das AH eine untere 8bit Zahl wäre? Was ja eigentlich AL ist? Denk mal darüber nach!Es bedeutet,daß in AH eine 8-Bit Zahl steht,sonst nix.Ob diese 8-Bit Zahl mit dem höherwertigen Byte oder dem niederwertigen Byte von AX dargestellt wird,ist ja egal.

Die Frage ist,ob man bei komplexer Portprogrammierung(Grafikchip,Soundchip usw.) nicht über zusätzliche Register froh wäre,die man "outen" kann.

Viele Register ist nicht immer positiv. Es gibts Risc und Cisc-Prozessoren, die einen haben wenig, die anderen viele Register. Alle haben ihre Bedeutung und Einsatzgebiete. Also kann man das nicht pauschalisieren.Die Anzahl der Allzweckregister hat ja nichts mit dem Befehlssatz zu tun.Der PPC hat ja richtig viele davon.;)

Die Frage,ob viele oder wenig Register,ist eh nur für den Assemblerprogrammierer relevant und aus der Sicht des Assemblerprogrammierers ist wohl meine Frage mit ja zu beantworten.

Den HLL-Programmierer interessiert das wohl wenig,müssen sich halt die Compilerentwickler damit rumschlagen.;)

Scavi
25.08.2004, 13:41
//Über DX gibt man ja auch das höherwertige Byte von DX aus,z.B. Port 65535.

Genau, du gibst dh UND dl aus. Aber keinesfalls nur dh!

//Es bedeutet,daß in AH eine 8-Bit Zahl steht,sonst nix.Ob diese 8-Bit Zahl mit dem höherwertigen Byte oder dem niederwertigen Byte von AX dargestellt wird,ist ja egal.

NEIN!! Warum heissen die Register wohl aH und aL ?! Um die Byteorder nicht zu vertauschen!

//Die Frage ist,ob man bei komplexer Portprogrammierung(Grafikchip,Soundchip usw.) nicht über zusätzliche Register froh wäre,die man "outen" kann.

Sicherlich, aber ist dies den Hardwarearchitekten wert? Sollen sich doch die Softwareentwickler den Kopf zerbrechen! Obwohl? Eigentlich brauchte ich noch nie mehr als 2 Register dafür!

//Die Anzahl der Allzweckregister hat ja nichts mit dem Befehlssatz zu tun.Der PPC hat ja richtig viele davon.;)

..klar bei 32 Fliesskommaregistern ;)

//Die Frage,ob viele oder wenig Register,ist eh nur für den Assemblerprogrammierer relevant und aus der Sicht des Assemblerprogrammierers ist wohl meine Frage mit ja zu beantworten.

Also mir reichen die Register vollkommen aus. Wer mehr brauch hat seinen Algorithmus nicht richtig überdacht.

MarcoD
25.08.2004, 22:16
//Über DX gibt man ja auch das höherwertige Byte von DX aus,z.B. Port 65535.

Genau, du gibst dh UND dl aus. Aber keinesfalls nur dh!

NEIN!! Warum heissen die Register wohl aH und aL ?! Um die Byteorder nicht zu vertauschen!Nun,wenn ich DOS-Interrupts verwende,dann steht die Funktionsnummer der Interrupts(z.B. 09h) auch in AH und zwar unabhängig von dem,was in AL steht.So kann man z.B. 255 in AL reinladen,der Wert von AH wird damit nicht tangiert,der bleibt 9.


Sicherlich, aber ist dies den Hardwarearchitekten wert? Sollen sich doch die Softwareentwickler den Kopf zerbrechen! Obwohl? Eigentlich brauchte ich noch nie mehr als 2 Register dafür!Haste denn schon mal so komplexe Sachen mit Parallax-Scrolling und haste-nich-gesehen über Ports programmiert? Werde es aber noch feststellen,wenn ich in der Assemblerthematik weiter vorgedrungen bin.;)


Also mir reichen die Register vollkommen aus. Wer mehr brauch hat seinen Algorithmus nicht richtig überdacht.Klar kann man mit den vorhandenen Registern alles programmieren.Es wird dann halt nur umständlicher bei komplexen Sachen.

Scavi
26.08.2004, 10:52
Nun,wenn ich DOS-Interrupts verwende,dann steht die Funktionsnummer der Interrupts(z.B. 09h) auch in AH und zwar unabhängig von dem,was in AL steht.So kann man z.B. 255 in AL reinladen,der Wert von AH wird damit nicht tangiert,der bleibt 9.

Interrupts sind doch was ganz anderes. Da dient das Register (also der Inhalt) nur dafür um in einer Tabelle die richtige Zeile zu finden und auf deren Inhalt (ne Adresse) zu springen.

Haste denn schon mal so komplexe Sachen mit Parallax-Scrolling und haste-nich-gesehen über Ports programmiert? Werde es aber noch feststellen,wenn ich in der Assemblerthematik weiter vorgedrungen bin.;)

Also für Graphikspass nutze ich OpenGL.


Klar kann man mit den vorhandenen Registern alles programmieren.Es wird dann halt nur umständlicher bei komplexen Sachen.
Deswegen ist es sehr wichtig sein Programm ordentlich zu strukturieren und viele Teile in Unterfunktionen auszulagern.

MarcoD
26.08.2004, 23:49
Interrupts sind doch was ganz anderes. Da dient das Register (also der Inhalt) nur dafür um in einer Tabelle die richtige Zeile zu finden und auf deren Inhalt (ne Adresse) zu springen.Es ging darum,aufzuzeigen,daß AH und AL als zwei eigenständige und voneinander unabhängige Register verwendet werden können.Hätte jetzt auch z.B. sub ah,5 als Beispiel nehmen können,da wird der Wert in AL auch nicht verändert.Die Byteorder wird wohl nur eingehalten,wenn ich eine 8-Bit Zahl in ein 16-Bit Register lade.Dann setzt er logischerweise zuerst die Bits im Low-Byte.Das war auch zuerst mein Gedankengang,daß die CPU auch bei der Teilung der Register in AH und AL so verfährt.Dem ist aber nicht so.Daher auch meine anfängliche Verwirrung.:)


Also für Graphikspass nutze ich OpenGL.Klar,ist ja wesentlich einfacher.Es ist eh fraglich,ob die aktuellen Grafikprozessoren entsprechend dokumentiert sind.


Deswegen ist es sehr wichtig sein Programm ordentlich zu strukturieren und viele Teile in Unterfunktionen auszulagern.Logo! ;)

Scavi
27.08.2004, 10:35
Na da haben wir ja jetzt alles geklärt ;)