Forum: Compiler & IDEs ATtiny10: Assembler unter Linux inkorrekte Jumps


von Sven (Gast)


Lesenswert?

Hallo zusammen,

ich versuche gerade unter Ubuntu ein kurzes Assembly-Listing für den 
ATtiny10 zu übersetzen. Hierbei stoße ich nun auf ein Problem, welches 
ich selbst nicht mehr lösen kann.

Folgende Datei (main.S):
.equ DDRB, 0x01
.equ PORTB, 0x02

.org 0x0000
  rjmp  main

main:
  ldi r16, 0xFF
  out DDRB, r16

loop:
  sbi PORTB, 2
  nop
  cbi PORTB, 2
  nop
  rjmp loop

Übersetzen mit:
avr-as -mmcu=avrtiny10 main.S

Dump zeigen:
avr-objdump -d a.out

Ergebnis:
00000000 <main-0x2>:
   0:  00 c0         rjmp  .+0        ; 0x2 <main>

00000002 <main>:
   2:  0f ef         ldi  r16, 0xFF  ; 255
   4:  01 b9         out  0x01, r16  ; 1

00000006 <loop>:
   6:  12 9a         sbi  0x02, 2  ; 2
   8:  00 00         nop
   a:  12 98         cbi  0x02, 2  ; 2
   c:  00 00         nop
   e:  00 c0         rjmp  .+0        ; 0x10 <loop+0xa>

Warum ist hier das "rjmp" am Ende der Loop inkorrekt? Dort sollte doch 
ein relativer Jump zurück stehen.
Habe ich evtl. noch einen Schritt vergessen wie Linken o.ä.?

Über den "avr-gcc" kann ich nicht gehen, da dieser den ATtiny10 nicht 
unterstützt: -mmcu=avrtiny10 sowie -mmcu=attiny10 kann ich nicht angeben 
bzw. wird mit Fehler abgebrochen. Gibt es andere Alternativen für Linux? 
Das AVR-Studio will ich ungern einsetzen.

Die verwendeten Versionen:
gcc version 4.7.2 (GCC)
GNU assembler version 2.20.1 (avr) using BFD version (GNU Binutils) 
2.20.1.20100303

Gruß
Sven

von Max D. (max_d)


Lesenswert?

Vor dem linken sind alle jmps 0.
Erst nach dem linken stimmen die dann.
Also:
Assemblieren
Linken (da mit -m avrtiny10)
Dumpen

von Sven (Gast)


Lesenswert?

Das mit dem Linken habe ich bereits versucht, jedoch erhalte ich hier 
einen merkwürdigen Fehler.

Ausführung:
avr-ld -m avrtiny10 a.out

Ausgabe:
a.out: file not recognized: File truncated

Was muss ich denn noch angeben? Ich habe ja keine Bibliothek verwendet 
gegen die ich linken muss.

Ich bin mir sicher dass etwas fehlt in der Befehlszeile. Der Linker hat 
einfach viel zu viele Optionen.

Gruß
Sven

von Max D. (max_d)


Lesenswert?

1
avr-as -mmcu=attiny10 -o main.o main.S
2
avr-ld -m avrtiny10 -o main.elf main.o
3
avr-objcopy --output-target=ihex main.elf main.hex
4
avrdude -p t10 -c avrisp2 -P usb -U flash:w:main.hex:i

Hier ein Beispiel um unter Linux ein File main.S in ein fertiges .hex 
file umzuwandeln und zu flashen

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.