Fehlermeldung bei Hi-TECH-C im Inlinecode.

Es gibt 12 Antworten in diesem Thema, welches 2.329 mal aufgerufen wurde. Der letzte Beitrag (8. Juni 2018 um 00:20) ist von daybyter.

  • Hallo, guten Tag.

    Wie kann man bitte einen Wert xyz im Hi-Tech-c übergeben.


    Ich bekommen folgende Meldung (siehe Bild)

    Danke.
    Gruss

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

    Code
    void werte(xyz)
    int xyz;
    {
    #asm
    LD BC,(xyz)
    LD A,(C)
    #endasm
    }

    Wissen ist das einzige Gut, das sich beim Teilen vermehrt. Also seid vorsichtig damit!

  • 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...

    10 x=rnd(-1963):fori=1to81:y=rnd(1):next
    20 forj=1to5:printchr$(rnd(1)*16+70);:next
    30 printint(rnd(1)*328)-217

    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

  • Operand-Error Zeile 8 habe ich jetzt gescheckt.
    Aber undefe nid Symbol kommt noch für xyz in Zeile 7.

    Danke.
    Gruss

  • unbedingt Hitech-C verwenden will, wenn er seine Funktionen eh komplett in Assembler schreibt

    Naja in C, aber ohne C ;)
    :weg:

    Bitte melde dich an, um diesen Link zu sehen.

    Bitte melde dich an, um diesen Link zu sehen.

  • 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.

    10 x=rnd(-1963):fori=1to81:y=rnd(1):next
    20 forj=1to5:printchr$(rnd(1)*16+70);:next
    30 printint(rnd(1)*328)-217

    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

  • Das ist die einzige Möglichkeit.

    Gruss

  • Dein int liegt doch ganz oben auf dem Stack? Dann wäre die korrekte Operation, um xyz in DE zu bringen doch pop de , oder?
    Hat der z80 einen Befehl um SP-relativ zu laden? Müsste ich erstmal im Zaks suchen...

    Aber probier mal

    pop de
    push de

  • 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...

  • Hallo danke.
    Der Code wird fehlerfrei compiliert.

    Er steigt bloß aus dem Programm nicht aus. Nur durch Reset.

    Gruss

  • 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;
    {
    Bitte melde dich an, um diesen Link zu sehen.
    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
    Bitte melde dich an, um diesen Link zu sehen.
    }

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