Datentypen

Datentypen


Die folgende Tabelle gibt einen Überblick über alle Datentypen:

Datentyp Größe in bits Größe auf dem Stack verwendbar im GCC
char 8 1 JA JA
short 16 2 JA JA
int 18 2 JA JA
long 36 4 JA JA
long long 72 8 NEIN ?
float 36 4 NEIN ?
double 72 8 NEIN ?
Pointer 18 2 JA JA


Es wird empfohlen für normale Berechnungen den Typ mit der nativen Wortbreite int zu verwenden. Die Verwendung von short bedingt Konvertierungen, da beispielsweise die Addition immer mit 18-Bit durchgeführt wird und auch im Speicher immer 18-Bit belegt werden.
Um bei der Speicherung von Werten Platz zu sparen, empfiehlt sich nach Möglichkeit die Verwendung von char.

Schlüsselwörter


Nahezu alle Schlüsselwörter können gemäß des ANSI-Standards verwendet werden.

Schlüsselwort verwendbar
signed JA
unsigned JA
enum JA
const JA
extern nur wenn die Funktion oder Variable in einer eingebundenen Assembler-Datei definiert wird (siehe Assembler einbinden)
register JA
static JA
void JA
struct JA
union JA
typedef JA
sizeof JA (Größe in Gruppen von 9 Bit )
array JA
switch JA
* (Festkomma) nur 18-Bit signed und 17-Bit unsigned *) 36 Bit für Produkt nutzbar
* (Fließkomma) NEIN
/ (Festkomma) maximal mit 17-Bit Werten
/ (Fließkomma) NEIN


*) Bei der Multiplikation ist das Ergebnis immer 36 Bit. Die unteren 18 Bit werden in das Zielregister des Befehls geschrieben und bilden damit auch das Ergebnis der Multiplikation in C. Will man die oberen 18 Bit der letzten Multiplikation auch auslesen, dann muss mul_high.inc und mul_high.h angewendet werden. Die Dateien stellen eine Funktion bereit, mit der einer int Variablen die oberen 18 Bit der letzten Multiplikation zugewiesen werden.

#include  <mul_high.h>

   int    h_mul, l_mul, a, b;

   l_mul  = a * b;
   h_mul  = mul_high();

Im GCC kann das nicht auf diesem Wege realisiert werden, da durch die Optimirung die Funktion mul_high() vor dem MUL Befehl landet. Im GCC kann aber das Format long für das Produkt verwendet werden, welches mit der Funktion mul36(fa1, fa2) berechnet wird.
#include <mul36.h>

  unsigned long  prod;
  unsigned int   a, b;

  prod = mul36(a, b);


Funktionen

Funktionsaufrufe können ganz normal verwendet werden, mit und ohne Rückgabewert, mit und ohne Argumente.

Funktionen mit maximal **4 Argumenten** sind besonders effektiv, da die 4 I/O-Register verwendet werden. Alle weiteren Argumente benötigen beim Zugriff zwischen 1 und 4 Befehle mehr.


Main-Funktion

Die main-Funktion kann weder Argumente übernehmen noch einen Wert zurückgeben, wenn sie als eigenständiges Programm für die Hardware übersetzt wird. Hat man doch einen return eingebaut, so wird er im LCC automatisch als Endlosschleife übersetzt. Im GCC muss jedes Main Programm mit einer Endlosschleife beendet werden!

void main() {
    int a = 1;
    while (1) {
    }
}

Wird die main-Funktion über den Monitor gestartet (nur LCC), dann kann ein Fehlerkode zurückgegeben werden. Ist er 0, dann liegt kein Fehler vor und der Monitor meldet sich mit seinem Prompt. Ist der Wert ungleich 0, dann wird vor dem Prompt ein "?" ausgegeben.


int main() {
int a = 1;
return 0;
}


SpartanMC