ndr-nkc.de ndr-nbc.de
  
Startseite
News
 
NDR-NKC
Geräte Z80
Geräte 68000
Geräte 8088
 
NKC Emulator
 
Z80 Section
Baugruppen
ROM's
Software
68000 Section
Baugruppen
ROM's
PASCAL/S
Software
CP/M 68K
8088 Section
Baugruppen
Downloads
 
Bussysteme
Stromversorgung
Input / Output
Grafikkarten
Speicherkarten
Massenspeicher
Weitere Baugruppen
 
Projekte
 
Dokumentation
Datenblätter
Glossar
Portraits
Links

Impressum

 

Inline-Assembler

Fü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 Beispiel

Zur 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 C

Hä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 C

Die 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 BIOS

Mittels 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     */


Weiter zu Teil 6 der Serie: Assembler-Bibliothek für den NKC

Zurück zu Teil 4 der Serie: Der Übersetzungsvorgang