Forum: Mikrocontroller und Digitale Elektronik AVR ATmega Compiler fehlerhaft oder Denkfehler?


von Herbert K. (avr-herbi)


Lesenswert?

Hallo,
gibt es bei mir einen Denkfehler, macht der Compiler Fehler, oder macht 
der Disassembler Fehler? Code soll sein für den ATmega8

Also von R0 bis R15 sind die PUSH, POP, DEC zwar richtig, aber bei LDI 
sind die Register immer um 16 höher laut Disassembler.

Ich habe ziemlich lange in meinem eigentlichen Code gesucht und dann so 
eine merkwürdige Stelle gefunden, weil das Programm nicht läuft.

Beim Ändern auf andere Register unter R16 war das dann genau so. Darum 
habe ich mal diesen Beispielcode erstellt (der so Unsinn ist, nur zum 
Compiler / Disassembler Check).

Viele Grüße Herbert


Source:
procedure CHECK_Inline_ASM;
  begin { CHECK_Inline_ASM }
    asm
      push R0
      LDI  R0,0
      DEC  R0
      pop  R0

      push R1
      LDI  R1,$01
      DEC  R1
      pop  R1

...
...

      push R16
      LDI  R16,16
      DEC  R16
      pop  R16
    end;
  end;  { CHECK_Inline_ASM }

Ergebnis des Disassemblers (ReAVR Version 3.2.0 beta vom 23.04.2005)
  push  r0
  ldi  r16,k00
  dec  r0
  pop  r0

  push  r1
  ldi  r17,k01
  dec  r1
  pop  r1

...

ab die Register von R16 bis R31 sind dann ok:

  push  r16
  ldi  r16,k10
  dec  r16
  pop  r16


Aus dem LST Output des Compilers nur mal für R0 und R1

0x01EE  0x920F      PUSH       R0
0x01F0  0xE000      LDI        R0, 0
0x01F2  0x940A      DEC        R0
0x01F4  0x900F      POP        R0

0x01F6  0x921F      PUSH       R1
0x01F8  0xE011      LDI        R1, 1
0x01FA  0x941A      DEC        R1
0x01FC  0x901F      POP        R1

Aus dem LST Output des Compilers nur mal für R16 und R17

0x0276  0x930F      PUSH       R16
0x0278  0xE100      LDI        R16, 16
0x027A  0x950A      DEC        R16
0x027C  0x910F      POP        R16

0x027E  0x931F      PUSH       R17
0x0280  0xE111      LDI        R17, 17
0x0282  0x951A      DEC        R17
0x0284  0x911F      POP        R17

von Purzel H. (hacky)


Lesenswert?

Aeh ja. Die optimierungen sind natuerlich abgeschaltet ?

von spess53 (Gast)


Lesenswert?

Hi

'LDI' gibt es bei den Registern r0..r15 nicht.

MfG Spess

von Herbert K. (avr-herbi)


Lesenswert?

Hallo @spess53,
Danke! Ich kannte die Einschränkung nicht.

Schade, das der Compiler nicht meckert und der Disassembler auch nicht.

Ich habe es aber nun auch im Datenblatt gefunden (Seite 91 DOC0856.pdf) 
falls jemand auch auf so ein Problem stößt.

Viele Grüße Herbert


LDI – Load Immediate
Description:
Loads an 8 bit constant directly to register 16 to 31.
Operation:
(i) Rd ← K
Syntax: Operands: Program Counter:
(i) LDI Rd,K 16 ≤ d ≤ 31, 0 ≤ K ≤ 255 PC ← PC + 1

von Hc Z. (mizch)


Lesenswert?

Welcher Compiler ist das denn?

von Herbert K. (avr-herbi)


Lesenswert?

Compiler: M_i_k_r_o_P_a_s_c_a_l_P_r_o_V_2_._1_0
Disassembler: ReAVR Version 3.2.0 beta vom 23.04.2005

von Herbert K. (avr-herbi)


Lesenswert?

Der Fehler LDI R0-R15 steckt auch im:
AVR Warteschleifen Generator V 1.2

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
Noch kein Account? Hier anmelden.