Hi, ich befasse mich nach einer lagen Pause wieder mal mit Assembler und habe ein Problem, bei dem ich nicht weiter komme: call sub ruft wie gewollt das Unterprogramm sub auf. Jetzt wollte ich das ganze mit icall probieren, aber ldi r30, lo8(sub) ldi r31, hi8(sub) icall schlägt leider fehl. so sieht das ganze in der .lss-Datei aus: (beide Varianten hintereinander) c4: 0e 94 49 00 call 0x92 ; 0x92 <sub> c8: e2 e9 ldi r30, 0x92 ; 146 ca: f0 e0 ldi r31, 0x00 ; 0 cc: 09 95 icall Wo liegt der Fehler? Viele Dank schon mal im Voraus.
Die GNU binutils arbeiten mit Byte-Adressen, auch im Code. Der Assembler setzt bei CALL die Byte-Adresse 0x92 in die von der Maschine verwendete Wortadresse um: 0x92/2 = 0x49. Bei ICALL musst du das selber machen. Also ldi r30, lo8(0x92/2) ldi r31, hi8(0x92/2)
hallo der icall ist der indierekte sprung zu einer adresse/label du hast ein label und darauf wird nur aufaddiert z.B.: start: ldi zl,low(sub) ldi zh,high(sub) inc zl icall rjmp start sub: test1 test2 . . test1: ret test2: ret
ÄÄÄHHHM ich muss mein Bsp. korrigieren sub ist ein Befehl und sollte als label nicht verwendet werden ausser du gibst dich mit dieser Meldung zufrieden C:\etronik\Software3\ATMEGA8\tester\indadr.asm(96): error: syntax error, unexpected MNEMONIC z.B.: start: ldi zl,low(test) ldi zh,high(test) sts $0060,zl start2 icall lds zl,$0060 inc zl sts $0060,zl rjmp start test: rjmp test1 rjmp test2 . . test1: ret test2: ret
ja mei weiss ich doch, das is ja auch nur zum verständniss und bei "start2" der "rjmp start" muss "start2" stehen
@chris: Die Frage dürfte sich auf den GNU-Assembler beziehen, du hingegen verwendest den Atmel-Assembler. Die sich in der Frage der Adressierung vom ROM unterscheiden.
genau, die Frage bezieht sich auf GNU-Assembler. Vielen Dank schon mal A. K. kann zwar leider noch nicht testen, aber das erklärt den Fehler. eine Frage noch zu deinem Bsp.: ldi r30, lo8(0x92/2) ldi r31, hi8(0x92/2) müsste es nicht ldi r31, hi8(0x00/2) in diesem Fall jetzt heißen? oder beides mal sub/2? so steht doch dann 0x4646 im Z-Reg., oder?
ja gut ging aus dem text net hervor, steht ja nur assembler, aber wahrscheinlich aus den quellcode dann habe ich nichts geschrieben (-:\ gutes gelingen
gast wrote:
> müsste es nicht ldi r31, hi8(0x00/2) in diesem Fall jetzt heißen?
Nein. 0x92/2=0x49 und hi8(0x49)=0.
Hast du überhaupt schon einmal etwas von Hex-Zahlen gehört? Deine "46"
legen diese Frage nahe.
gast wrote: > genau, die Frage bezieht sich auf GNU-Assembler. > > Vielen Dank schon mal A. K. > kann zwar leider noch nicht testen, aber das erklärt den Fehler. > > eine Frage noch zu deinem Bsp.: > ldi r30, lo8(0x92/2) > ldi r31, hi8(0x92/2) > müsste es nicht ldi r31, hi8(0x00/2) in diesem Fall jetzt heißen? > oder beides mal sub/2? Nene, ist schon richtig. Ist ja nicht '0x92/2', sondern da steht ja noch 'hi8' davor.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.