[C/C++] C (nein, nicht c++) Exceptions

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von swissmaster, 24. Februar 2011 .

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 24. Februar 2011
    C (nein, nicht c++) Exceptions

    n'abend jungs

    Folgendes: Wir müssen im Studium ein API erstellen in assembler, über welches C Functions aufgerufen werden können per Function Pointer (die Pointer werden in Tabellen gespeichert und per Index aufgerufen). Nun ist es so, dass diese Functions je nach dem Errors signalisieren können, bzw. im konkreten Fall beim einfügen eines Pointers in die Tabelle gibt’s Errors falls schon ein Pointer für eine Funktion steht.

    Unsere Struktur sieht vor, dass eine Datei api.h als Header File steht, dann gibt’s eine api.s, wo das Verhalten dieser nach Aussen aufrufbaren Functions gecodet sind (alles schon gemacht). Nun die Frage:

    In dieser api.s wird der allfällige Fehler detektiert, wie kann ich den zurück signalisieren an die aufrufende C-Methode? Leider steht in C kein try/Catch zur Verfügung...

    Hoffe das Prob ist einigermassen verständlich

    Greez
     
  2. 25. Februar 2011
    AW: C (nein, nicht c++) Exceptions

    return wert oO
    also in eax moven und das programm, dass die api benutz muss eben diesen return wert prüfen. Oder du baust dir nen eigenen error handler in die funktionen (z.B ausgabe in eine textdatei) aber das wäre unschön.
     
  3. 25. Februar 2011
    AW: C (nein, nicht c++) Exceptions

    und wie setzt man in assebmler einen return wert? welches register ist das?
     
  4. 25. Februar 2011
    AW: C (nein, nicht c++) Exceptions

    ax/eax/rax

    Je nachdem ob 16/32/64 Bit Assembler

    Im Allgemeinen ist es so dass ein Return Wert von 0 aussagt, dass alles in Ordnung ist. Bei ungleich 0 ist ein Fehler aufgetreten.
     
  5. 25. Februar 2011
    AW: C (nein, nicht c++) Exceptions

    es geht um 32-bit. nun das mit 0 oder -1 oder whatever ist dann Definitionssache, es ist noch nicht ganz klar welche Werte normal und welche Fehler repräsentieren. Mein Problem ist eher noch, in welches Register ich diese Return werte stellen kann in Assembler, dass sie von c als Return wert verstanden werden, wenn in Assembler "bx lr" kommt und er von der Subroutine zurückspringt...
     
  6. 25. Februar 2011
    AW: C (nein, nicht c++) Exceptions

    Kannst du mal genau sagen was du eigentlich machen willst und was genau du programmierst und worauf? Welches Betriebssystem, genaue CPU Architektur?

    Wahrscheinlich programmierst du was für ein Smartphone?

    Alle bisherigen Posts beziehen sich auf x86_32 oder x86_64, aber das passt natürlich nicht zu ARM.
     
  7. 25. Februar 2011
    AW: C (nein, nicht c++) Exceptions

    es ist ein i.MX27 CPU von Freescale (der basiert auf einem ARM926 CPU mit 400MHz, 32Bit). Programmiert wird mit eclipse unter Ubuntu. Es geht um eine Wetterstation (also ein eigenständiges System), welches über I2C Sensoren angeschlossen bekommt. Nun gibts z.B. Regensensoren, wenn die ansprechen gibts ein Interrupt, welche z.B. automatisch die Sonnenstoren hochgehen lassen. Damit diese Interrupts abgefangen werden können, gibts die API, welche dann die Functions in einem Table mit Function Pointers aufrufen kann. Dazu natürlich noch die Funktionen zum hinzufügen, entfernen von Funktionen, damit später nicht alles neu kompiliert werden muss.
     
  8. 25. Februar 2011
    AW: C (nein, nicht c++) Exceptions

    Ok also dann wird dir da wohl kaum einer richtig helfen können. Assembler ist eben nicht gleich Assembler. Jeder CPU Typ hat eigene Register und Befehle.

    Du schaust dann am besten mal in deine ARM Assembler Doku und suchst nach einem "Accumulator" Register. So nennt sich in der Regel das Register was die Ergebnisse einer Funktion/Berechnung beinhaltet. Da packst du dann das Ergebnis rein und hoffst das es von C als solches erkannt wird.
     
  9. 25. Februar 2011
    AW: C (nein, nicht c++) Exceptions

    Kurz gegoogled: Calling convention - Wikipedia, the free encyclopedia
    Aber ka ob das jetzt richtig ist :S
     
  10. 25. Februar 2011
    AW: C (nein, nicht c++) Exceptions

    Das habe ich auch gesehen, aber es scheint mir nicht logisch, da ich keine Programmiersprache kenne, welche mehrere Return werte haben kann... oder täusche ich mich da?

    *edit* so wies aussieht behalten die Register ihre werte (die Eingangsparameter vom Funktionsaufruf)...
     
  11. 26. Februar 2011
    AW: C (nein, nicht c++) Exceptions

    Darum geht es doch gar nicht. Die Calling conventions besagen, dass in r0 bis r3 return values stehen dürfen. ARM ist 32-Bit, vielleicht willst Du ein 64bit Wert zurückgeben, dann pack sie in r0 und r1. Oder 128 Bit, dann hast Du r0 bis r3 voll.

    Schau Dir doch den schönen Wikipedia-Artikel einmal an, den pyro Dir genannt hat. Da steht eindeutig, dass r0 bis r3 von einer Funktion nicht behalten werden müssen! Umgekehrt bedeutet dies aber nicht, dass r0 bis r3 verändert werden müssen. Wenn die Funktion etwa leer ist, warum sollte sie r0 bis r3 anfassen? Laut Calling Convention darfst Du Dich aber nur darauf verlassen, dass r4-r11 unverändert bleiben.

    Hast Du gerade erst mit Assembler angefangen? Warum suchst Du Dir dann soetwas schwieriges gleich heraus?
     
  12. 27. Februar 2011
    AW: C (nein, nicht c++) Exceptions

    zum beantworten der letzten frage zuerst:

    nö wir haben schon 1 semester während 4 stunden pro woche assembler gelernt, C ebenfalls. Nur halt noch nie eine verbindung von beidem

    Aber vielen dank für deinen Ansatz, hab das mal versucht und das klappt tatsächlich :], wenn ich von hand diesen registern neue werte gebe, die anderen register wieder in originalzustand versetze und dann die subroutine beende.

    mfg swissmaster

    *close & bw
     
  13. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.