automatisierungstechnik ap1 - · pdf file automatisierungstechnik ap1 elementare...

Click here to load reader

Post on 28-Jan-2019

216 views

Category:

Documents

0 download

Embed Size (px)

TRANSCRIPT

Automatisierungstechnik AP1 Elementare Programmiertechniken 1 1

AutomatisierungstechnikAP1

-- Elementare Programmiertechniken --

Verarbeiten breiter OperandenTransportierenLogische Verknpfungen und TestsAddierenSubtrahierenErhhen/VermindernVergleichenVerschieben

Rechnen mit natrlichen und ganzen BinrzahlenAdditionSubtraktionMultiplikationDivisionMultiplizieren und Dividieren durch VerschiebenRundenSttigungsarithmetikBinr codierte Dezimalzahlen

EinzelbitoperationenWodurch wird ein einzelnes Bit bestimmt?Bitadresse und BitmaskeFeste und berechnete BitpositionenBits setzenBits lschenBits transportierenBits abfragen

BitfeldoperationenWodurch wird ein Bitfeld bestimmt? Bitfeldtransporte

BitvektoroperationenPosition der niedrigstwertigen EinsPosition der hchstwertigen EinsAnzahl der Einsen

Rechnen mit Booleschen FunktionenDarstellung Boolescher Funktionen

Speicheradressierung und AdrerechnungZeichenketten, Vektoren, Matrizen, Records

Verzweigungen

Schleifen

Automatisierungstechnik AP1 Elementare Programmiertechniken 1 2

Unterprogramme

Der Stackmechanismus

Automatisierungstechnik AP1 Elementare Programmiertechniken 1 3

Operationen mit drei OperandenSchema: := op

1. := 2. op rc, rb

Beispiel:

MOV rc, raADD rc, rb

Testoperationen (Verknpfungen ohne berschreiben des ersten Operanden)1. Prinzip: ein drittes Register als Hilfsregister verwenden. Dann weiter gem Operationen mit dreiOperanden.

2. Prinzip: Zielregister (PUSH) retten und wiederherstellen(POP)

Beispiel:

PUSH rdSUB rd, rsPOP rd

Verarbeiten breiter OperandenGelegentlich sind Operand zu verarbeiten, deren Bitanzahl ein Mehrfaches der Verarbeitungsbreitebetrgt.

TransportierenDie Operanden werden abschnittsweise gem der Verarbeitungsbreite transportiert.

Transportieren zwischen direkt adressierten Registern (MOVE)Wenn es keine Mglichkeiten zur Adrerechung gibt, bleibt nur eine Folge von Transportbefehlen,wovon jeder einen Abschnitt (z. B. ein Byte) bewegt.

MOV rd_lo, rs_loMOV rd_hi, rs_hi

Transportieren zwischen Registern und Speicher (LOAD, STORE)Bei direkter Adressierung (keine Adrerechung zur Laufzeit) bleibt nur eine Folge von Transportbefeh-len, wovon jeder einen Abschnitt (z. B. ein Byte) bewegt. Dabei ist vom 2. Befehl an eine jeweils um 1erhhte Speicheradresse einzutragen (Adrerechnung kann dem Assembler berlassen werden).

LDS rd_lo, mem_adrsLDS rd_hi, mem_adrs+1

Bei indirekter Adressierung mu das Adreregister jeweils um 1 erhht werden (Postincrement).

LD rd_lo, Z+LD rd_hi, Z+

Transportieren zwischen SpeicheradressenDas mu auf Transporte Speicher => Register, Register => Speicher zurckgefhrt werden (LOAD-STORE-Folgen).

Automatisierungstechnik AP1 Elementare Programmiertechniken 1 4

Direkte Adressierung:

LDS r, s_adrsSTS d_adrs, rLDS r, s_adrs+1STS d_adrs+1, r

Indirekte Adressierung (Beispiel: Quelladresse in Y, Zieladresse in Z):

LD r, Y+ST Z+, rLD r, Y+ST Z+, r

Laden von Direktwerten:

LDI rd_lo, low(immediate)LDI rd_hi, high(immediate)

Holen von Direktwerten aus dem Programmspeicher:

LPM rd_lo, Z+LPM rd_hi, Z+

Wenn diese LPM-Version nicht untersttzt wird:

LPMMOV rd_lo, r0ADIW Z, 1LPMMOV rd_hi, r0ADIW Z, 1

NullerweiterungZu fllende Stellen mit Festwert Null belegen bzw. lschen.

LDS rd_0, mem_adrsLDS rd_1, mem_adrs+1EOR rd_2, rd_2MOV rd_3, rd_2

VorzeichenerweiterungZu fllende Stellen je nach Vorzeichen mit Festwert Null oder Eins belegen bzw. lschen oder setzen.

LDS rd_0, mem_adrsLDS rd_1, mem_adrs+1EOR rd_2, rd_2SBRC rd_1,7COM rd_2MOV rd_3, rd_2

Automatisierungstechnik AP1 Elementare Programmiertechniken 1 5

Logische Verknpfungen und TestsDer typische Test betrifft lediglich die Nullbedingung (Ergebnis = 0 oder 0 (Zero-Flag)).

a) Verknpfungsresultat, kein TestAbschnittsweise Verknpfung:

AND rd_0, rs_0AND rd_1, rs_1AND rd_2, rs_2AND rd_3, rs_3

b) nur Test, Verknpfungsresultat bedeutungslosMan knnte nach jedem Abschnitt testen und bei Ergebnis 0 ans Ende verzweigen.

AND rd_0, rs_0BRNE readyAND rd_1, rs_1BRNE readyAND rd_2, rs_2BRNE readyAND rd_3, rs_3ready:

c) Verknpfungsresultat und TestHerausspringen ist nicht mglich.

1. Vorschlag: Testen mit zustzlichem Hilfsregister rt. rt wird it dem ersten Teilergebnis geladen. Alleweiteren Teilergebnisse werden disjunktiv verknpft. Jede Eins im Ergebnis bleibt somit gleichsam inrt hngen (rt 0 , wenn Ergebnis 0).

AND rd_0, rs_0MOV rt, rd_0AND rd_1, rs_1OR rt, rd_1AND rd_2, rs_2OR rt, rd_2AND rd_3, rs_3OR rt, rd_3

2. Vorschlag: Ergebnis wird wie blich gebildet und dann insgesamt getestet. Hierzu wird die besondereUntersttzung der Z-Flag im SBCI-Befehl ausgenutzt. Ist das (Teil-) Ergebnis ungleich B Null, wird dieZ-Flag gelscht, ist es gleich Null, wird die Belegung nicht gendert. Eine von einem voraufgegangenenBefehl mit Ergebnis 0 gelschte Z-Flag wird also nicht durch ein nachfolgendes Nullergebnis wiedergesetzt, sondern bleibt gleichsam hngen (Sticky Flag).

AND rd_0, rs_0AND rd_1, rs_1AND rd_2, rs_2AND rd_3, rs_3SUBI rd_0, 0SBCI rd_1, 0SBCI rd_2, 0SBCI rd_3,0

Automatisierungstechnik AP1 Elementare Programmiertechniken 1 6

AddierenDie Addition beginnt mit einem gewhnlichen Additionsbefehl und wird dann mit Additionsbefehlenfortgesetzt, die den Eingangsbertrag bercksichtigen. Achtung: ADC hat leine Sonderuntersttzung frdie Nullbedingung. Das Ergebnis mte also ggf. gesondert auf Null getestet werden (wie vorstehendbeschrieben).

ADD rd_0, rs_0ADC rd_1, rs_1ADC rd_2, rs_2ADC rd_3, rs_3

SubtrahierenDie Subtraktion beginnt mit einem gewhnlichen Subtraktionsbefehl und wird dann mitSubtraktionsbefehlen fortgesetzt, die den Eingangsbertrag bercksichtigen. Die Z-Flag gibt am Endeder Rechnung die Nullbedingung des gesamten Ergebnisses wieder (Sticky Flag).

SUB rd_0, rs_0SBC rd_1, rs_1SBC rd_2, rs_2SBC rd_3, rs_3

Addieren und Subtrahieren von Operanden unterschiedlicher Lnge

1. Lsung: HilfsregisterDer erste Operand wird durch ein Hilfsregister verlngert, das mit einem passenden Festwert (0 oderFFH (Vorzeichenerweiterung)) geladen wird. (Es gibt Prozessoren, die spezielle Registeradressenhaben, die passende Festwerte liefern.)

ADD rd_lo, rsADC rd_hi, r_aux

SUB rd_lo, rsSBC rd_hi, r_aux

Automatisierungstechnik AP1 Elementare Programmiertechniken 1 7

2. Lsungbertrag abfragen und hhere Stellen um 1 erthhen oder vermindern

ADD rd_low, rsBRCC readyINC rd_hiready:

Wenn das Carry-Flag gestellt werden mu:ADD rd_low, rsBRCC readySUBI rd_hi, -1ready:

SUB rd_low, rsBRCC readyDEC rd_hiready:

3. LsungFestwertaddition oder -subtraktion mit Eingangsbertrag.

ADD rd_low, rsADIC rd_hi, 0

Der AVR hat keine Festwertaddition (ADIC fehlt). Subtraktion von 0 fhrt aber zu Fehler, weil dasCarry-.Flag beim Addieren anders gebildet wird (mte zwecks Subtraktion invertiert werden). DeshalbLsung nur bei Subtraktion sinnvoll.

SUB rd_low, rsSBCI rd_hi, 0

Addieren und Subtrahieren von DirektwertenDies wird durch die Befehle SUBI und SBCI untersttzt. Das Addieren ist auf das Subtrahieren desZweierkomplements zurckzufhren. Zweierkomplementbildung erledigt der Assembler. LngereDirektwerte (z. B. 32 Bits) mten ggf. anderweitig umgerechnet und byteweise hexadezimal angegebenwerden. Die Z-Flag gibt am Ende der Rechnung die Nullbedingung des gesamten Ergebnisses wieder(Sticky Flag).

Addieren:

SUBI rd_lo, low(-immediate)SBCI rd_hi, high(-immediate)

Subtrahieren:

SUBI rd_lo, low(immediate)SBCI rd_hi, high(immediate)

Alternative:Hilfsregister verwenden, die mit den Direktwerten geladen werden.

Automatisierungstechnik AP1 Elementare Programmiertechniken 1 8

Erhhen, Vermindern (Increment, Decrement)Beim Erhhen wird eine Eins addiert, beim Vermindern eine Eins subtrahiert. Hierzu knnen die BefehleSUBI und SBCI angegeben werden (wie vorstehend beschrieben). +1 = 00..01H, -1 = FF...FFH. Die Z-Flag gibt am Ende der Rechnung die Nullbedingung des gesamten Ergebnisses wieder (Sticky Flag).

Erhhen (Increment):

SUBI rd_0, 0xFFSBCI rd_1, 0xFFSBCI rd_2, 0xFF SBCI rd_3, 0xFF

Vermindern (Decrement):

SUBI rd_0, 1SBCI rd_1, 0SBCI rd_2, 0 SBCI rd_3, 0

Erhhen ohne Beeinflussung der C-Flag (mit INC-Befehlen):

INC rd_0BRNE readyINC rd_1BRNE readyINC rd_2BRNE readyINC rd_3 ready:

Vermindern ohne Beeinflussung der C-Flag (mit DEC-Befehlen):

TST rd_0BREQ dec_1DEC rd_0RJMP readydec_1:DEC rd_0TST rd_1BREQ dec_2DEC rd_1RJMP readydec_2:DEC rd_1TST rd_2 BREQ dec_3DEC rd_2RJMP readydec_3:DEC rd_2DEC rd_3ready:

Automatisierungstechnik AP1 Elementare Programmiertechniken 1 9

ZweierkomplementbildungDas Zweierkomplement kann durch Negieren und Erhhen um 1 gebildet werden:

COM rd_0COM rd_1COM rd_2COM rd_3SUBI rd_0, 0xFFSBCI rd_1, 0xFFSBCI rd_2, 0xFF SBCI rd_3, 0xFF

VergleichenDas Vergleichen ist typischerweise ein Subtrahieren ohne Ergebnisspeicherung. Das Verglei