Port-Register indirekt adressieren?

Gast #46428
Lesenswert?

Hallo !!

Wie kann ich mit so wenig Asm-Befehlen wie möglich die I/O-Ports
indirekt adressieren und beschreiben ? Befehle hab ich dafür nicht
gefunden. Bei IN und OUT muss die Adresse beim Assemblieren bereits
feststehen. In meinem Programm soll aber die Adresse erst während der
Laufzeit festgelegt werden..

Notfalls müsste ich eine Sprungtabelle wie
...
OUT12: OUT $12, R
       RJMP xx
OUT13: OUT $13, R
       RJMP xx
OUT14: OUT $14, R
       RJMP xx
...
benutzen, wenn es keine bessere Lösung gibt. Hat jemand eine Idee ?
Danke.

Daniel
Gast #46430
Lesenswert?

Hallo Joerg !

Ich hatte auch gehofft, dass es so funktioniert. Wenn man aber
folgendes Programm im Simulator abarbeitet, dann funktioniert nur die
Variante mit OUT:

    .include "4433def.inc"

    ldi R16, $FF       ;funktioniert für Port D
    out portd, R16

    ldi XL, portc      ;funktioniert nicht für Port C
    ldi XH, 0
    st X, R16

Der Port-Bereich ist scheinbar aufgrund der internen Architektur nur
für IN und OUT zugänglich, trotz des gleichen Speichers !?

Daniel
Gast #46432
Lesenswert?

hi Joerg !

Hab meinen Fehler gefunden ! Das Datenblatt kenn ich zwar, aber erst
das Lesen der 4433def.inc hat mich darauf gebracht, dass die
Portbezeichner nur relative Adressen für die Benutzung mit IN und OUT
enthalten. Man sollte halt vorgefertigten Dateien immer misstrauisch
gegenüberstehen..

Vielen Dank für deine Hilfe !
Daniel

(noch mehr Misstrauen sollte man vor Compilern haben ;)
Gast #46433
Lesenswert?

Nö, zumindest der avr-gcc löst das auf intelligente Weise. ;-)

Sämtliche IO wird dort über die Speicheradressen erledigt, da diese
Methode die einzige ist, bei der man erstens indirekt adressieren
kann und bei der zweitens garantiert ist, daß man jeden Port auch
erreicht (der ATmega128 hat Ports, die nur über das memory mapping
erreichbar sind).

Die Ersetzung durch entsprechend effizientere IN/OUT/CBI/SBI wird,
wenn immer (infolge der Randbedingungen der Operanden) erst durch
den Optimierer vorgenommen.

Dadurch kann man komplett dieselbe Syntax für alles benutzen.  Man
sollte natürlich die Architektur des Chips im Hinterkopf behalten,
da es eben sein kann, daß

REGISTER |= (1 << BITNUMMER);

nicht in jedem Falle tatsächlich durch ein SBI abgebildet werden
kann.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren