Hallo Besucher, der Thread wurde 2,2k mal aufgerufen und enthält 12 Antworten
letzter Beitrag von daybyter am
-
-
-
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...
-
-
unbedingt Hitech-C verwenden will, wenn er seine Funktionen eh komplett in Assembler schreibt
Naja in C, aber ohne C
-
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.
-
Das ist die einzige Möglichkeit.
Gruss
-
Naja in C, aber ohne C
Kommt wohl daher weil er folgender Spruch gehört hat: Pascal programmers are so blind because they can't C.
-
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.
Code
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;
{
#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?