Hallo Besucher, der Thread wurde 2,2k mal aufgerufen und enthält 12 Antworten

letzter Beitrag von daybyter am

Fehlermeldung bei Hi-TECH-C im Inlinecode.

  • Hitech-C wird noch kein ANSI-C unterstützen sondern noch den "guten" alten K&R Style

    Die Anleitung behauptet, dass es ANSI-C verwenden würde und Funktionsprototypen versteht. Leider dokumentiert sie die ABI nicht und sagt zu #asm/#endasm nur, dass der Code darin 1:1 in den vom Compiler erzeugten Assemblercode kopiert wird.


    Mir ist es allerdings ein Rätsel, warum spacer unbedingt Hitech-C verwenden will, wenn er seine Funktionen eh komplett in Assembler schreibt...

  • Ich möchte den C128 mit HI-TECH-C proggen.


    Die Routine für den VDC möchte ich in ASM schreiben, Werte an die Register übergeben.
    Hier ist ein Beispiel wenn ich feste Werte übergebe, das funktioniert.
    Nun möchte ich die Werte aber übergeben an die ASM-Function.
    Darum möchte ich gerne oben im kleinen Beispiel wissen, wie das eigentlich funktioniert.


    Danke.
    GRuss


  • Nun möchte ich die Werte aber übergeben an die ASM-Function.
    Darum möchte ich gerne oben im kleinen Beispiel wissen, wie das eigentlich funktioniert.

    Es besteht die realistische Möglichkeit, dass das so obskur ist, dass niemand anderes in diesem Forum genau das schonmal gemacht hat und dir daher niemand sagen kann, wie du deinen Code ändern musst.


    Allerdings besteht zumindest die theoretische Möglichkeit, dass du das selbst herausfindest: Schreib eine C-Funktion, die die gewünschte Signatur hat und ihre Argumente in irgendwelche globalen Variablen schreibt und disassemblier diese, um herauszufinden wie der generierte Code auf die Argumente zugreift.

  • Ein Stück weiter. Was ich gesagt hab, ist natürlich so Quatsch. Zuerst werden die Parameter auf den Stack gepushed und danach die Return-Adresse. Danach kommen evtl. lokale Variablen der Funktion, aber die haben wir ja hier nicht.




    So etwa könnte ich mir das Beispiel vorstellen...

  • Kann sein, dass der noch was auf den Stack packt? Kannst nach dem Funktionsaufruf was ausgeben, und schauen, ob das dann angezeigt wird?


    Man sollte vielleicht auch in der Funktion mal was machen, was man kontrollieren kann. Z.B. einen Wert in eine Speicheradresse schreiben, damit man sieht, ob das gemacht wurde.


    Der Pointer auf zahl zeigt ja am Anfang _irgendwo_ hin und dort schreibt man dann 15 rein. Das kann so nicht gut sein.


    Vielleicht besser mal eine int Variable erzeugen und die dann an die Funktion übergeben?


    void main(int argc, char *argv[]) {
    int zahl=15;


    werte(zahl);
    }


    Und im nächsten Schritt einen Pointer nehmen, und ne Änderung machen, die man überprüfen kann.
    Z.B. so:


    char test=0; // sollte test als volatile deklariert sein?
    char *p = &test;


    werte(p);


    und in werte dann z.B. eine 1 in den Speicher schreiben, auf den p zeigt:


    void werte(xyz)
    char *xyz;
    {
    #asm
    pop de ; save return address
    pop hl ; fetch xyz
    ld a.1
    LD (hl),a ; *p=1; also sollte test jetzt 1 sein
    push hl ; restore stack
    push de ; push return address
    #endasm
    }


    Jetzt sollte test eigentlich 1 sein, und man könnte das ausgeben, um zu schauen, ob das stimmt?