ATmega328P Assembler Inline-Text und Assembler ALIGN

Ich habe ein Programm in Assembler wie folgt:

        lots of code
        ......

.ORG $7000 ;;  (or somewhere) 

atext:   .DB    "this is a test string 1"

         .ALIGN EVEN    

Btext:   .DB    "this is a test string 2"
  1. FRAGE : Angenommen, die Länge von Text 1 ist UNGERADE. Ist es möglich, Btext mit einem ALIGN-Befehl (wie oben) auszurichten? Der Atmel Assembler (studío 6.2) sagt NEIN - aber ich frage mich....

(Problem leicht gelöst durch manuelle Ausrichtung wie folgt:

atext:   .DB    "this is a test string 1",0,0
   //            01234567890123456789012  3 4      

Und das Hinzufügen von Nullen, wo nötig, um auszurichten.

  1. FRAGE :

Ich möchte jetzt den Text auf meinen seriellen Monitor schreiben.

Also mache ich das;

      ldi zh,High (text1)
      ldi zl,LOW (text1)
      push ZH 
      push ZL 
      lsl ZL  
      rol ZH  ;; to ensure LPM later 

WRTE: lpm R16,Z+ ; get byte/data 
      cpi R16,0  
      breq wrte2 
      call output
      rjmp wrte 
wrte2: 

      pop zl
      pop zh
      ret 

Jetzt frage ich mich: Wenn ich benutze

      ......       
WRTE: LD   R16,Z+      ; get byte/data /// BAD - DON'T 

  .....

Was bekomme ich in R16?

Beachten Sie, dass Z den Programmspeicher als Bytes indiziert. Der Assembler stellt sicher, dass die Befehls-Opcodes ausgerichtet sind, aber für Daten spielt es keine Rolle.
Vielen Dank für die Ausrichtung meiner Codebeispiele - beim Schreiben ist etwas schrecklich schief gelaufen. Kris
Was möchten Sie auch ausrichten Btext , gerade, ungerade oder etwas anderes? Warum? Ich denke, @Jon hat Ihre Frage beantwortet - das Ausrichten von Daten spielt keine Rolle, da Daten byteadressierbar sind. Vielleicht sollte Jon den Kommentar zu einer Antwort hochstufen?

Antworten (1)

  1. Der Programmspeicher ist 16 Bit breit und der Programmadressenbus verweist auf Wörter und nicht auf Bytes, sodass beispielsweise die PC-Adresse 1 das zweite WORT im Programmspeicher ist. Der Programmspeicher-Adressbus kann keine einzelnen Bytes innerhalb eines Wortes auswählen.

.dbsetzt den Text automatisch an eine 'gerade' Adresse (wobei der String bei Bedarf mit einer Null aufgefüllt wird), da das Byte-Äquivalent aller Programmspeicheradressen gerade ist (die tatsächliche Adresse kann ungerade oder gerade sein, je nachdem, auf welches WORD verwiesen wird). Daher besteht keine Notwendigkeit für eine 'ALIGN EVEN'-Direktive.

Der LPM-Befehl leitet die Bits 15-1 des Z-Registers an die Programmspeicheradressen-Bits 14-0 (bezieht sich auf bis zu 32k Wörter oder 64k Bytes), und Bit 0 wird verwendet, um das untere oder obere Byte im Wort auszuwählen. Deshalb müssen Sie die Programmadresse beim Einfügen in das Z-Register mit 2 multiplizieren.

  1. Programmspeicher (ROM) und Datenspeicher (RAM) befinden sich auf getrennten Bussen. Wenn Sie einen regulären LD-Befehl verwenden, greift er auf den Datenspeicher (nicht den Programmspeicher) zu und liest den Inhalt des RAM an dieser Adresse. RAM ist 8 Bit breit und wird in Bytes adressiert, sodass die Adresse, auf die zugegriffen wird, genau die ist, die im Z-Register steht.
Vielen Dank für die Kommentare. Den 2'ten Absatz (beginnt automatisch mit .db.. ) kannte ich nicht. Das beantwortet meine erste Frage vollständig. Mein Gedanke zur 2. Frage war: