unsigned char readCMOS (unsigned char a)
{
outportb(0x70,a);
return inportb(0x71);
}
... würde etwa folgenden Code (in Assembler) erzeugen ...
_READCMOS proc near
push bp ; 1 byte
mov bp,sp ; 2 "
mov ax,[bp+4] ; 3 "
push ax ; 1 "
mov ax,70h ; 3 "
push ax ; 1 "
call _OUTPORTB ; 3 "
pop cx ; 1 "
pop cx ; 1 "
mov ax,71h ; 3 "
push ax ; 1 "
call _INPORTB ; 3 "
pop cx ; 1 "
pop bp ; 1 "
ret ; 1 "
_READCMOS endp ; Summe: 26 byte
ziemlich umständlich oder ?
vergleichbare Prozedur für reines Assembler Programm :
READCMOS proc near ; Parameterübergabe in AL ; Rückgabewert in AL
out 70h,al ; 2 byte
in al,71h ; 2 "
ret ; 1 "
READCMOS endp ; Summe: 5 byte
Die Code und Zeitersparnis ist deutlich zu erkennen.
Zum Thema UNIX ist zu bemerken, das ein Gerät nunmal keine Datei ist, also ein Linux/Windows Programmierer sich nicht zwangsweise mit Hardware- und BIOS-zugriff auskennt. (Ich habe - im Ernst - mal in einem Linux forum gelesen, dass einer nicht weis wofür die Befehle IN und OUT sind). Viel wichtiger ist es sich mit DOS auszukennen, denn da arbeitet man ständig mit BIOS und Hardwarezugriffen, und weis auch wie man zum Beispiel erkennt ob und was für Geräte angeschlossen sind. Und das ist genau dass, was die Klicki-Bunti-Objekti-Hochsprachi-Programmierer eben nicht können.
: Diese C-vs.-Assembler-Diskussion gab es mehr als einmal und Assembler hat immer den kürzeren gezogen (weil zeitaufwendig und fehleranfällig). Wenn du ernsthaft daran interessiert bist, such dir im Forum die passenden Threads raus und lies sie. Wenn nicht, troll bitte woanders weiter. Dein Beispiel habe ich mal ausprobiert, siehe unten... --[[Benutzer:Taljeth|Taljeth]] 11:54, 20. Apr. 2011 (CEST)
kwolf@dhcp-5-188:/tmp/c$ cat cmos.c
static inline void outportb(short port, char value)
{
asm volatile("outb %0, %1" : : "a" (value), "Nd" (port));
}
static inline char inportb(short port)
{
char value;
asm volatile("inb %1, %0" : "=a" (value) : "Nd" (port));
return value;
}
unsigned char readCMOS (unsigned char a)
{
outportb(0x70,a);
return inportb(0x71);
}
kwolf@dhcp-5-188:/tmp/c$ gcc -O2 -c cmos.c
kwolf@dhcp-5-188:/tmp/c$ objdump -d cmos.o
cmos.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 :
0: 89 f8 mov %edi,%eax
2: e6 70 out %al,$0x70
4: e4 71 in $0x71,%al
6: c3 retq
:''Nächster Beitrag:'' Ich weiß nicht, wieso ich antworte. Vermutlich bin ich sehr anfällig für Flamewars. Vielleicht möchte ich auch nur ein paar Sachen klarstellen, falls irgendein unglücklicher Anfänger das hier zufälligerweise liest und für bare Münze nimmt. Hast du den C-Code mal kompiliert? Vermutlich nicht. Ich schon. Leider hat taljeth das auch gemacht. Also lasse ich die erste Hälfte von meinem Beitrag einfach mal weg. Hinzuzufügen wäre noch, dass man bei neueren GCCs ja auch -flto benutzen kann, dann wird die Funktion readCMOS sogar dann direkt eingebunden, wenn sie sich in einer anderen Datei befindet. Aus
int _start(void)
{
return readCMOS(42);
}
:wird dann
00000000 <_start>:
_start():
0000000: b8 2a 00 00 00 mov eax,0x2a
0000005: e6 70 out 0x70,al
0000007: e4 71 in al,0x71
0000009: 0f b6 c0 movzx eax,al
000000c: c3 ret
:Ich sehe da rein gar keinen Geschwindigkeitsnachteil zu deinem handoptimierten Assembler. Im Gegenteil, der gcc spart sich sogar den Funktionsaufruf und macht alles über Register.
:Zu dem OS-Kommentar sag ich einfach mal nichts, das ist wirklich Geschmackssache. Und wenn vielleicht irgendwann alle Rechner mit ARM laufen, braucht man IN und OUT ja sowieso nicht mehr (braucht man bei moderner Hardware außerdem überhaupt kaum noch, vielleicht mal zum Initialisieren, aber die ganzen Datenstrukturen liegen im Speicher und werden mit PCI-DMA abgearbeitet). —[[Benutzer:XanClic|Clici McXan]] 12:10, 20. Apr. 2011 (CEST)
Nur weil es bei einer Diskussion rauskommt, heist das noch lange nicht, dass Assembler tatsächlich fehleranfällig ist. In erster Linie hängt das einmal davon ab wie gut jamand eine Programmiersprache kann, und wie Gewissenhaft man Programmiert. Es ist aber auffällig, das moderne Software (die meistens in Hochsprachen geschrieben sind) häufiger Bugfixes und und "Service-Packs" benötigen, wärend ältere Assembler-Programme in der Regel einfach funktionieren. Um bei Betriebssystemen zu bleiben MS-DOS 5.0 ist z.b. von wesentlich höherer Qualität als Windows XP.
Was das C-Beispiel angeht, muss ich zugeben, das der GNU-C-Compiler das deutlich besser löst, als mein 80er Jahre Turbo-C-Compiler (bei dem Outportb tatsächlich eine Bibliotheksfunktion ist). (Wobei trotzdem noch die Frage bleibt, wieso im ersten Beispiel EAX statt AL genommen wird.)
Dann bleibt natürlich die Frage, wieso in einem '''Lowlevel'''-Wiki so viel '''Highlevel''' Programmiersprachen benutzt werden ? Es erweckt eher den Eindruck, als ob es hier überwiegend um in C geschriebene Unixoide Bertriebssystem geht.
Damit das Betriebssysteme Geschmackssache sind, hast du vollkommen recht, dann stellt sich aber die Frage, warum einige Artikel so übertrieben abfällig über DOS sind, und laut diesem Artikel UNIX-kenntnisse zur Lowlevel Programmierung nötig sind ? (Was übrigens auch weiter oben auf dieser Seite erwähnt wird). Es gibt schlieslich noch andere Betriebssysteme. Das ist eigentlich auch - wie man bei Wikipedia sagt - ''Point of View''.
Nebenbei werden der PCI- (Ports 0CF8h-0CFFh) und der DMA- (Ports 00h-0Fh) Controller eben mit den Befehlen IN und OUT gesteuert. [[Benutzer:IO.SYS|IO.SYS]] 21:32, 20. Apr. 2011 (CEST)
:Ich nehme an, dass man mit Fug und Recht behaupten kann, dass MS-DOS wesentlich einfacher als Windows XP war, sodass es bei weniger Code natürlich auch weniger Fehler gab. Zudem ist die Frage, ob die Sicherheitsanforderungen schon zu MS-DOS-Zeiten schon so stark waren wie heute. Wenn es damals eine Lücke gab, war das vielleicht nicht so schlimm, in den heutigen Zeiten des überall verbreiteten Internets ist das etwas ganz anderes, da kann man nicht auf die nächste Version warten, sondern muss sofort einen Fix herausbringen. Dass der Code an sich schlechter ist, heißt das nicht, und was das mit der verwendeten Sprache zu tun haben soll, erschließt sich mir gleich überhaupt nicht. Man kann in C einfach weniger Fehler machen als in Assembler. Das ist ein Faktum (ein C-Compiler gibt eine ganze Menge Warnungen aus, wenn man das will). Wenn der Assemblerprogrammierer dennoch weniger Fehler als der C-Programmierer macht, dann liegt das nicht an der Sprache, sondern daran, dass der Assemblerprogrammierer besser ist, mehr Zeit oder einen anderen Vorteil hat. Aber das ist dann ein unfairer Vergleich.
:Der Begriff „Lowlevel“ ist absolute Definitionssache. Aus Sicht eines Anwenders mag bereits HTML als lowlevelig erscheinen. Aus Sicht eines Assemblerprogrammierers ist die Funktionsweise der CPU noch lowleveliger. Und so weiter. Dieses Wiki beschäftigt sich laut Startseite mit der Betriebssystemprogrammierung – und die kann in jeder Sprache geschehen, die sich dafür eignet oder auch nicht. In Assembler, C, C++, Eiffel – was auch immer. Dem Masochismus sind kaum Grenzen gesetzt. C ist zumindest für Anfänger (und imho auch für alle anderen) einfach zu empfehlen, ich glaube einfach nicht, dass die meisten professionellen „Betriebssystementwickler“ dieser Welt zu blöd sind, sich die richtige Sprache auszusuchen (und heute nehmen sie eben C oder C++). Zudem empfehle ich einem Computeranfänger auch nicht gleich das Beste vom Besten in Sachen Computerhard- und -software, wenn er damit gar nichts anfangen kann, weil es sein Wissen komplett übersteigt, obwohl ich persönlich ganz toll damit klarkomme.
:Insgesamt möchte ich wirklich nicht in noch einen tiefen Flamewar einsteigen, im Forum gabs genug und ich wiederhole hier schon wieder alle Argumente aus den entsprechenden Threads. Jeder soll die Sprache wählen, die er mag. Aber dies hier ist nicht „Hochperformantes OS-Dev für erfahrene Entwickler im kommerziellen Bereich“, sondern „OS-Dev für ''Einsteiger''“. Und ein Einsteiger findet Assembler in aller Regel ziemlich… Abstrakt. Da man nun mal weitgehend auf Assembler verzichten kann, ohne Funktionalität einzubüßen, ist es doch kein Problem, wenn hier eben erstmal C empfohlen wird. Wechseln kann man ja immer noch, wenn man genügend Erfahrung mit Assembler gemacht hat.
:Und zu den netten Herren IN und OUT, die es heute im Desktopbereich wohl nur noch bei x86 gibt: Die PCI-Ports braucht man wie gesagt eigentlich nur bei der Initialisierung der Geräte. Und PCI-DMA hat mit ISA-DMA nichts zu tun. Ich bleibe dabei, IN und OUT werden im laufenden Betrieb vor allem vom Tastaturtreiber genutzt und das wars. ;-) —[[Benutzer:XanClic|Clici McXan]] 01:14, 21. Apr. 2011 (CEST)