mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik call vs icall


Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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)

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Käse.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ÄÄÄ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

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Immer noch Käse... kann überlaufen.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja mei weiss ich doch, das is ja auch nur zum verständniss und
bei "start2" der "rjmp start" muss "start2" stehen

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja gut ging aus dem text net hervor, steht ja nur assembler, aber 
wahrscheinlich aus den quellcode

dann habe ich nichts geschrieben (-:\

gutes gelingen

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.