![]() |
![]() |
Startseite News   NDR-NKC ![]() ![]() ![]() NKC Emulator Z80 Section ![]() ![]() ![]() 68000 Section ![]() ![]() ![]() ![]() ![]() 8088 Section ![]() ![]() Bussysteme Stromversorgung Input / Output Grafikkarten Speicherkarten Massenspeicher Weitere Baugruppen Projekte Dokumentation Datenblätter Glossar Portraits Links Impressum |
Inline-AssemblerFür zeitkritische Programmteile oder zur direkten Ansteuerung der Hardware können im C-Quelltext Anweisungen in 68000 Assemblersprache verwendet werden. Dazu dient die Funktion asm(). Jede Assembler-Instruktion muss im C-Quelltext auf einer eigenen Zeile codiert werden.
Ein erstes BeispielZur besseren Lesbarkeit des C-Quelltextes lassen sich kleine Unterprogramme in C-Funktionen auslagern. Im folgenden Beispiel eine Routine zur Initialisierung der seriellen Schnittstelle.
initser() { asm("MOVEA.L #$FFFFFFF0,A0"); /* Basisadresse der SER-Baugruppe */ asm("MOVE.B #$1E,D0 "); /* Wert für Kontrollregister */ asm("MOVE.B D0,2(A0) "); /* 19200 Baud aktivieren */ } Übergabe von Daten aus CHäufig ist es notwendig, Werte an das Maschinenprogramm zu übergeben. Die an eine C-Funktion übergebenen Parameter (hier char ch) können im Assembler-Code ab der Adresse #8(A6) ausgelesen werden. int sendchar(ch) char ch; { asm("MOVEA.L #$FFFFFFF0,A0"); /* Basisadresse der SER-Baugruppe */ asm("MOVE #8(A6),D0 "); /* Parameter ch nach D0 */ asm("L_0001: "); asm("MOVE.B 1(A0),D1 "); /* Statusregister lesen */ asm("BTST #1,D1 "); /* Sender bereit? */ asm("BEQ L_0001 "); /* wenn nicht, wiederholen */ asm("MOVE.B D0,0(A0) "); /* Zeichen senden */ } Die Datentypen int, char und bool belegen jeweils 2 Bytes auf dem Stack-Frame, für die Datentypen long, float und double sowie alle Pointer werden 4 Bytes belegt. Im nächsten Beispiel werden zwei long-Variablen übergeben, daher ist der erste Parameter bei 8(A6) und der zweite Parameter bei 12(A6) abgelegt. Rückgabe von Werten an CDie Rückgabe von Werten geschieht über das Register D0. Eine Return-Anweisung darf am Ende der Funktion nicht benutzt werden. long summe(wert1,wert2) long wert1,wert2; { asm("MOVE.L #8(A6),D0 "); /* Wert1 nach D0 */ asm("ADD.L #12(A6),D0 "); /* Wert2 addieren, Ergebnis in D0 */ } Aufruf von Funktionen des BIOSMittels des Inline-Assemblers lassen sich recht einfach Funktionen des BIOS direkt aufrufen. asm("MOVE #3,D0"); /* BIOS Funktionsnummer CONIN */ asm("TRAP #3"); /* BIOS Funktion aufrufen */
|