call vs icall

Gast #1229453
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.
Gast #1229488
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
Gast #1229502
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
Gast #1229568
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?
Gast #1229587
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren