Speicherorte im AVR-Hex-File

Ich versuche, die von AVR Studio generierte Hex-Datei zu verstehen. Ich habe einen Code in Assembler geschrieben. Der Code lautet wie folgt:

#include "m328pdef.inc"
.org 33
rjmp reset
reset: 
        add r16,r17
main:
        out DDRB,r16
        rjmp main

Das .orgist, meinen Code in den Speicherplatz 33 fest zu codieren. Dann habe ich die generierte Hex-Datei überprüft. Das ist wie folgt:

:020000020000FC
:0800420000C0010F04B9FECF5C
:00000001FF

Die 2. Zeile sollte von Interesse sein. Die Adresse, wo dies gespeichert ist, ist 0042. Wieso? Können Sie bitte mein Verständnis klären.

Antworten (2)

Dies ist eine Intel-Hex-Datei im Standardformat, die von Linkern vieler Hersteller verwendet wird.

Das erste Zeichen ist immer ':'

Die nächsten zwei Hexadezimalziffern sind die Byteanzahl in zweistelligen Paaren im Datenfeld der Zeile. Die erste Zeile hat also zwei Datenbytes, die nächsten acht Bytes und die letzten null Bytes.

Die nächsten vier Hexadezimalziffern sind die Adresse in Bytes. Olin hat bereits erwähnt, warum die Startadresse von 33 (0x21) als 0042 angezeigt wird.

Die nächsten beiden Hexadezimalziffern sind der Datensatztyp. 02 ist ein erweiterter Adresstyp, mit dem Adressen über die 64-KB-Grenze des ursprünglichen Formats hinaus erweitert werden können. Aber das Datenfeld nach der 02 in der ersten Zeile ist 0000, also gibt es in diesem Fall wirklich keine Erweiterung.

Die letzten beiden Hex-Ziffern sind die Prüfsumme (zur Berechnung siehe Wikipedia-Artikel).

In der zweiten Zeile sagt der 00-Datensatz, dass es ein Adressfeld (z. B. 0042) vor dem Datensatztyp und die acht Datenbytes nach dem Datensatztyp (00, C0, ... bis CF) geben wird.

Die letzte Zeile mit der Satzart 01 ist ein Satzende.

Ich kenne keine AVR-Binärdatei, daher ist dies eine Vermutung, obwohl sie sehr gut zu passen scheint.

Sie haben ihm gesagt, dass er Ihren Code bei 33 eingeben soll, was 21 Uhr ist. Adressen werden wahrscheinlich in der HEX-Datei verdoppelt, weil das adressierbare Wort breiter als 8 Bit ist, also 42h ergibt. Dies alles sollte natürlich im Linker- oder Assembler-Handbuch gut dokumentiert sein.

Olin. Kann ich bitte Ihr Gehirn kaufen?
Olin, überrascht, dass Sie dieses Format nicht erkannt haben, PIC verwendet dasselbe für seine Hex-Dateien. :)
@tcrosley: Ich habe das Format gut erkannt. Tatsächlich habe ich die HEX-Datei in der Frage kopiert und in eines meiner Dienstprogramme eingefügt, um sie zu interpretieren und die Bytes in einer besser lesbaren Form zu schreiben. Dadurch wurde bestätigt, dass sich das erste Byte tatsächlich an der Adresse 42h befindet. Was mir nicht bekannt ist, ist, wie die AVR-Tools die Standard-HEX-Datei verwenden, wie Adressen verdoppelt oder nicht oder andere Konventionen. Die Adressen werden auch für einige PICs verdoppelt, was eine plausible Erklärung schien, aber ich weiß nicht, wie breit adressierbare Teile von AVR-Befehlen sind, obwohl anscheinend mehr als 8 Bits vorhanden sind.
Ich ging gerade von Ihrem Kommentar "Ich weiß nichts über AVR-Binärdateien" aus. Ich hätte Ihre PIC-Expertise nicht in Frage stellen sollen.