Forum: Mikrocontroller und Digitale Elektronik Fehlermeldung: .db misalignment - padding zero byte


von Hagrid (Gast)


Lesenswert?

Hallo, ich wollte eine Codetabelle mit .db anlegen bekomme nun aber die 
Fehlermeldung: .db misalignment - padding zero byte.

Kann ich mir das ganze einfach machen und aus der Tabelle:
1
tabelle:
2
3
.db  0b00001000  ;0
4
.db  0b10111101  ;1
5
.db  0b00100010  ;2
6
.db  0b10100001  ;3
7
.db  0b00010101  ;4
8
.db  0b01000001  ;5
9
.db  0b01000000  ;6
10
.db  0b10101101  ;7
11
.db  0b10000000  ;8
12
.db  0b00000001  ;9

folgendes machen:
1
tabelle:
2
3
.db  0b00001000, 0b00001000  ;0
4
.db  0b10111101, 0b10111101  ;1
5
.db  0b00100010, 0b00100010  ;2
6
.db  0b10100001, 0b10100001  ;3
7
.db  0b00010101, 0b00010101  ;4
8
.db  0b01000001, 0b01000001  ;5
9
.db  0b01000000, 0b01000000  ;6
10
.db  0b10101101, 0b10101101  ;7
11
.db  0b10000000, 0b10000000  ;8
12
.db  0b00000001, 0b00000001  ;9

Dann bekomme ich die Fehlermeldung nicht, was ja auch gewissermaßen Sinn 
ergibt. Allerdings weiß ich nicht ob sich das dann später auf den 
Zugriff auswirkt.

von Georg G. (df2au)


Lesenswert?

Welche CPU? Welcher Assembler?

von Hagrid (Gast)


Lesenswert?

Ich benutze einen ATmega8 und das Programm AtmelStudio zum 
Programmieren.

von Georg G. (df2au)


Lesenswert?

Die Atmels sind im Flash wortweise organisiert.
Wenn du dann nur 9 Bytes definierst, muss der Assembler ein Byte 
anflicken.
Das sagt dir die Fehlermelddung.

von spess53 (Gast)


Lesenswert?

Hi

>Kann ich mir das ganze einfach machen und aus der Tabelle:

Setze einfach jeweils 2 byte aus der 1. Tabelle hintereinander:

.db  0b00001000, 0b10111101
.db  0b00100010, 0b10100001
....


MfG Spess

von Georg G. (df2au)


Lesenswert?

spess53 schrieb:
> Setze einfach jeweils 2 byte aus der 1. Tabelle hintereinander

Dann muss er dennoch den letzten Eintrag "gerade" machen...

von spess53 (Gast)


Lesenswert?

Hi

>Dann muss er dennoch den letzten Eintrag "gerade" machen...

Es sind doch 10 Zeilen. Ergibt 5 Zeilen mit 2 Byte.

MfG Spess

von Georg G. (df2au)


Lesenswert?

spess53 schrieb:
> 10 Zeilen

Sry, hatte nur die "9" am Ende der letzten Zeile gesehen.

von Hagrid (Gast)


Lesenswert?

spess53 schrieb:
> Hi
>
>>Kann ich mir das ganze einfach machen und aus der Tabelle:
>
> Setze einfach jeweils 2 byte aus der 1. Tabelle hintereinander:
>
> .db  0b00001000, 0b10111101
> .db  0b00100010, 0b10100001
> ....
>
> MfG Spess

Stimmt, dass macht die ganze Tabelle kleiner.

Danke!

von Axel S. (a-za-z0-9)


Lesenswert?

Georg G. schrieb:
> Die Atmels sind im Flash wortweise organisiert.
> Wenn du dann nur 9 Bytes definierst, muss der Assembler ein Byte
> anflicken.

Das Zählen mußt du noch üben. Von 0 bis 9 sind das 10 Zeilen, also 10 
Bytes respektive 5 Flash-Worte.

> Das sagt dir die Fehlermelddung.

Ich vermute viel eher, daß die Startadresse der Tabelle misaligned ist 
- also auf einer ungeraden Byte-Adresse liegt. Weswegen der Assembler 
ein Nullbyte am Anfang der Tabelle einfügen muß.

Aber da wir weder das komplette Programm kennen noch die vollständige 
Fehlermeldung (z.B. auf welche Zeile sich die Meldung bezieht) können 
wir da nur mutmaßen.


XL

von spess53 (Gast)


Lesenswert?

Hi

>Ich vermute viel eher, daß die Startadresse der Tabelle misaligned ist
>- also auf einer ungeraden Byte-Adresse liegt. Weswegen der Assembler
>ein Nullbyte am Anfang der Tabelle einfügen muß.

Wie soll das gehen? Der Assembler setzt die Adresse einer Quelltextzeile 
immer auf eine Wordadresse. Wenn sich aber eine ungerade Anzahl 
.db-Anweisungen in der Zeile befinden wird ein Paddingbyte angefügt. Und 
das ist in der ersten Tabelle in jeder Zeile der Fall.

MfG Spess

von c-hater (Gast)


Lesenswert?

Hagrid schrieb:

> Hallo, ich wollte eine Codetabelle mit .db anlegen bekomme nun aber die
> Fehlermeldung: .db misalignment - padding zero byte.
>
> Kann ich mir das ganze einfach machen und aus der Tabelle:

> tabelle:
>
> .db  0b00001000  ;0
> .db  0b10111101  ;1
[...]

> folgendes machen:

> tabelle:
>
> .db  0b00001000, 0b00001000  ;0

Ja. Das ist sogar die einzig sinnvolle Antwort auf die Beschränkungen 
des AVR-Assemblers.

> Dann bekomme ich die Fehlermeldung nicht, was ja auch gewissermaßen Sinn
> ergibt. Allerdings weiß ich nicht ob sich das dann später auf den
> Zugriff auswirkt.

Nun, deine erste Variante würde zu Fehlern beim Zugriff führen. Genau 
deswegen wirft der Assembler doch die Warnung!

von c-hater (Gast)


Lesenswert?

Axel Schwenke schrieb:

> Ich vermute viel eher, daß die Startadresse der Tabelle misaligned ist
> - also auf einer ungeraden Byte-Adresse liegt.

Das kann beim Atmel-Assembler einfach nicht vorkommen.

Die einzige Möglichkeit, ein Misaligment zu produzieren, ist eine 
.DB-Zeile mit einer ungeraden Zahl von Argumenten. Dies wird aber immer 
und unter allen Umständen bereits in dieser Zeile korrigiert und 
produziert nebenbei eben die im OP zitierte Warnung.

In meinen Augen ist übrigens die Verwendung von Wortadressen im CSEG ein 
krasse Fehlentscheidung von Atmel. Viel sinnvoller wäre gewesen, wie 
auch in den anderen Segmenten mit Byteadressen zu arbeiten und statt 
dieser dümmlichen Odd-Warnung mit Zwangs-Padding lieber einen echten 
Fehler zu werfen, wenn Code auf Odd-Adressen assembliert werden soll. 
Oder meinetwegen auch das Zwangs-Padding mit Warnung nur für den Fall zu 
implementieren, daß nach einer Folge von .DB-Zeilen mal wieder Code 
assembliert wird.

von Peter D. (peda)


Lesenswert?

Mach es so:
1
tabelle:
2
.db 0b00001000, \
3
    0b10111101, \
4
    0b00100010, \
5
    0b10100001, \
6
    0b00010101, \
7
    0b01000001, \
8
    0b01000000, \
9
    0b10101101, \
10
    0b10000000, \
11
    0b00000001

von c-hater (Gast)


Lesenswert?

Peter Dannegger schrieb:

> Mach es so:

> tabelle:
> .db 0b00001000, \
>     0b10111101, \

OMG.

Nein, das ist reinste C-Frickelei. Und funktioniert (im Unterschied zu 
C) obendrein im Atmel Assembler nicht in Macros, jedenfalls nicht immer 
so, wie man es erwarten würde.

Also bitte ganz schnell vergessen oder höchstens für den ultimativen 
syntaktischen Notfall als letzte Ausweich-Möglichkeit im Gedächtnis 
bewahren.

Was ich persönlich ziemlich lustig finde: Diese fanatischen C-Frickler 
benutzen das " \" einerseits mit größter Selbstverständlichkeit als 
"Zeilenverbinder", lachen sich aber andererseits über das (absolut 
gleichwertig idiotische) " _" von einigen Basic-Dialekten halbtot. Mir 
scheint, daß diese Typen da etwas mit zweierlei Maß messen...

Wie einfach und logisch ist da doch Pascal (und seine Abkömmlinge). Die 
Zeile ist genau dann zu Ende, wenn der Parser auf ein ";" trifft, 
welches nicht Teil eines Stringliterals ist.

Naja, in Sprachen, die nicht den räudigen Bastard eine Macroassemblers 
darstellen, kann man schon wirklich einfache, in sich konsistente und 
logische Syntaxregeln postulieren...

von Bole aus Serbien (Gast)


Lesenswert?

c-hater schrieb:
> Wie einfach und logisch ist da doch Pascal (und seine Abkömmlinge). Die
> Zeile ist genau dann zu Ende, wenn der Parser auf ein ";" trifft,
> welches nicht Teil eines Stringliterals ist.

 Genau !
 Und ich glaube mich erinnern zu konnen, das C in NASA verboten war ?
 Naturlich is so was jedem normalen Mensch sofort klar:

         while(R+i) { s = D=0;
          if (r-R) { n(19) if (G[R+i][T]+i) V=T/2 ;
           else if(G[R][T]+i) s++;
           if(s) { if(V>4){ V=9-V;
           D++;
          } V+=29;  ... usw.

 Ich muss nicht normal sein...

von Bastler (Gast)


Lesenswert?

Schwachsinnig formatierten Code kann man aber in (fast) jeder Sprache 
schreiben. Aber nur in C ist es nie die Schuld des Schreibers.
Wäre doch schön wenn sämtliche C-Software sich weigern würde, solchen 
Blödsinn zu speicher, zu routen, anzuzeigen, ...
Ohne C hätten wir von dessen "hatern" nie erfahren.

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.