Forum: Compiler & IDEs VVR-GCC (Assembler & Compiler): Platzverschwendung


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Bernd (Gast)


Bewertung
0 lesenswert
nicht lesenswert
AVR-GCC (Assembler & Compiler): Platzverschwendung


Zwei Quellprogramme - ein C- und ein Assemblerprogramm werden übersetzt 
und gelinkt. Im LSS- bzw. HEX-File ist danach eine Lücke von 400 Bytes 
zwischen dem Assembler- und dem C-Teil zu sehen.

Das Assemblerprogramm enthält eine Anweisung ".p2allign 9" zum 
Ausrichten von Tabellen. Entferne ich diese Anweisung, dann verschwindet 
die Lücke.

Die Anweisung mit ."p2align 0" o . ä. aufzuheben hatte keinen Erfolg.

Warum wirkt sich die ".palign 9" Anweisung überhaupt auf eine andere 
Datei aus und wie ist dieses Problem zu lösen?

1
...
2
3
Tab01:
4
...
5
6
Tab02;
7
...
8
9
Tab07;
10
...
11
12
; 400-Bytes Lücke
13
14
main:
15
...

von C is great (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Mit palign 9 weist du den Compiler an, die Daten an einer 512 
Byte-Grenze auszurichten. Da deine Daten vermutlich kleiner sind, werden 
400 Füllbytes eingefügt. Der Compiler macht nur was du von ihm 
verlangst.

von Bernd (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Das ist nicht richtig. Du hast das Problem nicht verstanden und/oder 
einfach meinen Beitrag nicht durchgelesen.

Es gibt nur eine Anweisung ".p2align 9" in der Assemblerquelltextdatei. 
Die sich vor der ersten Tabelle befindet.

Wieso wird dann die main() aus der C-Quelltextdatei ebenfalls 
ausgerichtet?

von Markus F. (mfro)


Bewertung
0 lesenswert
nicht lesenswert
.p2align wirkt gemeinhin nur ein Mal, genau an der Stelle wo's steht.

Wenn das bei dir anders aussieht, hat das wahrscheinlich eine andere 
Ursache.

Kannst Du dein .map-File posten?

von c-hater (Gast)


Bewertung
-2 lesenswert
nicht lesenswert
Bernd schrieb:

> Es gibt nur eine Anweisung ".p2align 9" in der Assemblerquelltextdatei.
> Die sich vor der ersten Tabelle befindet.
>
> Wieso wird dann die main() aus der C-Quelltextdatei ebenfalls
> ausgerichtet?

Dafür kann es nur eine einzige Erklärung geben: das main-Symbol hat eine 
größere Adresse als die Adresse, an der die "Anweisung" (eigentlich ist 
es nur eine Direktive) .p2align 9 steht und dazwischen ist nix 
sonstiges.

Denn diese Direktive macht nix anderes, als den Code- oder Datenblock, 
der nach ihr beginnt, an einer 512Byte-Grenze auszurichten UND dafür 
zu sorgen, dass auch 512Byte in diesem Block verfügbar sind!

D.h.: im Extremfall (gerade 1 Byte über die Blockgrenze beim vorherigen 
Code und ein Byte Nutzdaten im aligned block), werden im Falle eine 
512byte-alignments 1022 Bytes nutzlos verschwendet.

Blöd? Ja, aber: Strunzblöd war nur der Programmierer, denn es macht 
natürlich absolut keinen Sinn, für ein verschissenes Byte ein derartiges 
Alignment zu vereinbaren. Sowas macht nur Sinn für Tabellen, auf die 
besonders schnell zugegriffen werden soll. Und dann ist es in aller 
Regel so, dass die Tabellengröße der Größe des Alignments entspricht 
(oder ein ganzzahliges Vielfaches davon ist).

Und nunja: es kann Ausnahmen von dieser Regel geben. Die sind "notfalls" 
komplett in Assembler zu lösen.

Ich vermute aber mal ganz stark, dass die meisten C-Compiler durchaus 
auch in der Lage wären, so ein Szenario sinnvoll abzudecken. Sehr 
wahrscheinlich entweder durch einen weiteren Parameter für .p2align, der 
klarstellt wieviel Space im aligned block tatsächlich verwendet werden 
soll oder durch die Verfügbarkeit einer anderen Direktive mit ähnlichem 
Zweck, die aber eben zwei Parameter akzeptiert).

Ja ich hasse C, kann mir aber absolut nicht vorstellen, dass den Machern 
in 40+ Jahren nicht aufgefallen sein sollte, dass sowas unter gewissen 
Bedingungen nützlich sein könnte. So doof sind die wirklich nicht. Nur 
die reinen C-Benutzer sind im Allgemeinen strunzdoof.

von Carl D. (jcw2)


Bewertung
1 lesenswert
nicht lesenswert
Zu schade, daß die Anweisung an den Linker, die Section doch auf 512 
auszurichten, vom Assembler kam. Passiert halt, wenn man blind in den 
Hass-Textbausteinvorrat greift, ohne die Situation erfaßt zu haben.

von Bernd (Gast)


Bewertung
0 lesenswert
nicht lesenswert
@ Carl

Vielen Dank für deine (indirekte) Hilfe. Die Lösung sind natürlich 
Subsections. Funktioniert einwandfrei.

von c-hater (Gast)


Bewertung
-3 lesenswert
nicht lesenswert
Carl D. schrieb:

> Zu schade, daß die Anweisung an den Linker, die Section doch auf 512
> auszurichten, vom Assembler kam.

Nein, niemals, völlig unmöglich. Kein Assembler vereinbart von sich aus 
irgendwelche Alignments.

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
2 lesenswert
nicht lesenswert
c-hater schrieb:
> Nein, niemals, völlig unmöglich. Kein Assembler vereinbart von sich aus
> irgendwelche Alignments.

Es wurde vom Threadstarter in den Assemblerquelltext geschrieben:

> Das Assemblerprogramm enthält eine Anweisung ".p2allign 9" zum Ausrichten von 
Tabellen.

Willst Du das ernsthaft bestreiten, und behaupten, das hätte der 
C-Compiler angestellt?


Dein Hass auf Unverstandenes beginnt ernsthaft pathologisch zu werden.

von Carl D. (jcw2)


Bewertung
1 lesenswert
nicht lesenswert
c-hater schrieb:
> Carl D. schrieb:
>
>> Zu schade, daß die Anweisung an den Linker, die Section doch auf 512
>> auszurichten, vom Assembler kam.
>
> Nein, niemals, völlig unmöglich. Kein Assembler vereinbart von sich aus
> irgendwelche Alignments.

Im Gegensatz zu einem hier hat der Assembler die an ihn gerichteten 
Anweisungen verstanden. Leseschwäche gepaart mit Kinderstubendeffizit 
haben offenbar einen Namen.

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]
  • [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.