Forum: Mikrocontroller und Digitale Elektronik Assembler High-Byte und low-Byte


von Markus (Gast)


Lesenswert?

Hallo,

hierbei wird der Wert 250 in den Registern R16 und R17 geladen. Was 
bedeutet low und high? Was passiert hier genau? Ist unter Low die Null 
gemeint?


ldi R16, low(250)
ldi R17, High(250)

VG

von neuling (Gast)


Lesenswert?

Das Register besteht aus 16 Bit, die in jeweils 8 Bit LOW und 8 Bit HIGH 
unterteilt sind. Die ersten 8 HIGH, die zweiten 8 LOW

von Amateur (Gast)


Lesenswert?

high und low werden benutz um z.B. 16 Bit-Werte in getrennte Register zu 
laden.

Dein Beispiel ist mittelprächtig, da
low (250)  = FA ist und
high (250) =  0.

Erst oberhalb von 255 wird es interessant.
low (800)  = 20
high (800) =  3

Wohl gemerkt es geht um konstante Zahlen

von Peter R. (pnu)


Lesenswert?

Lass Dir vom Assembler das LST-file herstellen, in dem siehst Du es.

In die Klammer hat man eine Dezimalzahl geschrieben, die wohl auch 
größes als 255 sein darf und für die also nur eine 16 bit binärzahl 
reicht. Da sie nur 250dez ist, ist das hibyte Null und das lowbyte 
11111010

oder: in der Klammer darf eine 16-bit-Konstante stehen, die aus zwei 
8-bit-Zahlen besteht, eben hibyte und lobyte.

511 würde also geschrieben werden:

ldi r16,low(511)
ldi r17, high(511)

in r16 würde dann ffh und in r17 01h stehen

von Markus (Gast)


Lesenswert?

Amateur schrieb:
> high und low werden benutz um z.B. 16 Bit-Werte in getrennte
> Register zu
> laden.
Was meinst du mit FA? 250 ist ein ADC-Wert.

> Dein Beispiel ist mittelprächtig, da
> low (250)  = FA ist und
> high (250) =  0.

Wie hast du 20 und 3 ausgerechnet?

> Erst oberhalb von 255 wird es interessant.
> low (800)  = 20
> high (800) =  3
>
> Wohl gemerkt es geht um konstante Zahlen

von Em B. (mbrain)


Lesenswert?

Du weißt, das du für Assembler das Binär - und Hexadezimalsystem 
beherrschen mußt, oder? https://de.wikipedia.org/wiki/Hexadezimalsystem

: Bearbeitet durch User
von Peter R. (pnu)


Lesenswert?

Markus schrieb:
> Wie hast du 20 und 3 ausgerechnet?

Ich hab einen Taschenrechner, der dezimal in hex umrechnet, mit einem 
einzigen Tastendruck (Ätsch!).

ansonsten, zu Fuß:

          3h = 3 x 256d = 768d (ist das hibyte)
         20h =  32dez (ist das lobyte)
          800dez also = 320h, das man als 3 im hibyte und als 20 im 
lobyte schreibt.

Rechenfolge im einfachen Taschenrechner: 800 div 256 = 3,125
3h als hibyte merken, 3 von 3,125 abziehn, ergibt ,125 als Rest.
,125 mal 256 (vorherige Division aufheben) = 32
32 in hex umwandeln : 20h , das lobyte

: Bearbeitet durch User
von Amateur (Gast)


Lesenswert?

@ Markus
Du solltest Dich mal mit Binär- und Sedezimalzahlen beschäftigen.
800 dezimal entspricht 0320 sedezimal. Trennst Du diese 16-Bit Zahl in 
ihre zwei 8-Bit Teile auf, so kommst Du auf (high) 03 und (low) 20.

Natürlich kannst Du auch:
ldi R16, 32
ldi R17, 3 schreiben. Mir klappt’s bei dieser Schreibweise die 
Zehennägel hoch. Oder
ldi R16, 0x20
ldi R17, 0x3

Wenn Du am Fenster sitzt, wirf mal den Rechner an und stell ihn in den 
Programmiermodus um.
Da kannst Du Dezimalzahlen in Sedezimalzahlen umwandeln und umgekehrt.

von Markus (Gast)


Lesenswert?

Ah oki danke

800 entspricht 320
-> High 3
-> low



und

250 entspricht FA

Warum ist high 0 ?

Peter R. schrieb:
> Lass Dir vom Assembler das LST-file herstellen, in dem siehst Du
> es.
>
> In die Klammer hat man eine Dezimalzahl geschrieben, die wohl auch
> größes als 255 sein darf und für die also nur eine 16 bit binärzahl
> reicht. Da sie nur 250dez ist, ist das hibyte Null und das lowbyte
> 11111010

Muss die Zahl größer als 255 sein? Was ist wenn die Dezimalzahl 
beispielsweise 185 ist?

Danke

von Peter R. (pnu)


Lesenswert?

Markus schrieb:
> Muss die Zahl größer als 255 sein? Was ist wenn die Dezimalzahl
> beispielsweise 185 ist?
>
> Danke

Die Zahlen 0d bis 255d passen in die 8 bit des lobyte, und im hibyte 
steht dann Null. Die größeren Zahlen belegen auch das hibyte.

so ist 256 dann 0x00 in lobyte und 0x01 im hibyte (so schreibt man in 
C-syntax hex-Zahlen:  0x.. ) oder 0x0100

185 ist im lobyte 0xb9  (oder 0b10111001) und im hibyte Null, als 
16bit,hex geschrieben: 0x00b9 davon käme b9 in das r16 und 00 in das r17

: Bearbeitet durch User
von Amateur (Gast)


Lesenswert?

@ Markus

So wie 99 in zwei Dezimalstellen passt, so entwickeln sich 
Sedezimalzahlen auf ihre eigene Art:
Dez.  Hex.   High Low
0254  00FE   00   FE
0255  00FF   00   FF
0256  0100   01   00
0257  0101   01   01

Also passt 255 in 2 Sedezimalstellen
256 braucht 3 Stellen (üblicherweise 4)
so wie
99 in zwei Stellen passt
und 100 drei Stellen benötigt.

von Amateur (Gast)


Lesenswert?

Sorry in der Tabelle fehlt noch die Zehnägelhochklappspalte
Dez.  Hex.   High Low  High Low
0254  00FE   00   FE   0    254
0255  00FF   00   FF   0    255
0256  0100   01   00   1    0
0257  0101   01   01   1    1

Sedezimalzahlen entwickeln sich nicht auf der Basis 10 sondern auf der 
Basis von 16.
Die Platzhalter hierfür sind:
0 1 2 3 4 5 6 7 8 9 A B C D E F

Also:
Dez. Hex.
 0    0
 1    1
 2    2
 3    3
 4    4
 5    5
 6    6
 7    7
 8    8
 9    9
10    A
11    B
12    C
13    D
14    E
15    F
16   10
17   11
...  ...
31   1F
32   20
33   21

von Markus (Gast)


Lesenswert?

Peter R. schrieb:
> Markus schrieb:
>> Muss die Zahl größer als 255 sein? Was ist wenn die Dezimalzahl
>> beispielsweise 185 ist?
>>
>> Danke
>
> Die Zahlen 0d bis 255d passen in die 8 bit des lobyte, und im hibyte
> steht dann Null. Die größeren Zahlen belegen auch das hibyte.
>


Da die Zahl 250 in ein 8 Bit Register passt bräuchte ich keinen zweiten 
Register d.h. anstatt

ldi R16, low(250)
ldi R17, High(250)

kann ich auch

ldi R16, 250

schreiben.Oder?


Ich habe noch im Internet gelesen, dass bei einem 16 Bit- Wert, nur die 
Register ab R26 verwendet werden sollen ( anstatt R16,R17 sollen R26, 
R27)....

von Heinz V. (heinz_v)


Lesenswert?

Markus schrieb:
> Da die Zahl 250 in ein 8 Bit Register passt bräuchte ich keinen zweiten
> Register d.h. anstatt
>
> ldi R16, low(250)
> ldi R17, High(250)
>
> kann ich auch
>
> ldi R16, 250
>
> schreiben.Oder?

und ldi R17, 0

(oder eor R17, R17)

weil Du ja nicht weist welcher Wert noch in dem Register enthalten ist 
;-)

von Wolfgang (Gast)


Lesenswert?

Markus schrieb:
> Was meinst du mit FA? 250 ist ein ADC-Wert.

Mit "FA" war natürlich "0xFA", "FAh" oder welche Schreibweise auch immer 
gemeint, also die zur Dezimalzahl 250 äquivalente Hexadezimalzahl 
gemeint.

von Fpgakuechle K. (Gast)


Lesenswert?

Amateur schrieb:

> Dein Beispiel ist mittelprächtig, da
> low (250)  = FA ist und
> high (250) =  0.

Ne das Beispiel passt genau, auch eine 0 muss geladen werden, da ja 
sonstwas im Register stehen kann.

von Markus (Gast)


Lesenswert?

> Ich habe noch im Internet gelesen, dass bei einem 16 Bit- Wert, nur die
> Register ab R26 verwendet werden sollen ( anstatt R16,R17 sollen R26,
> R27).... Ist das so richtig?

Eine Frage noch zum Vergleich von Werten.. Wenn man die Inhalte zwei 
Register miteinander vergleicht, dann gibt es den Befehl cp
z.b. cp R17, R18

und dann folgt in den mesiten Beispielen cpc ( wie cp aber mit Carry 
Flag). Ich habe nirgendswo eine ausführliche Erklärung (Carry Flag) 
gefunden. Kann mir jemand sagen was bei cpc gemacht wird?



cp R17, R18
cpc R19, R20


Danke

von Thomas (kosmos)


Lesenswert?

Ja interessant wird es eben erst ab 256

Ich verwende z.B. in einer Division 3600 und dann schreibe ich eben

ldi R16, low(3600)
ldi R17, High(3600)

als es erst mit dem Win-Taschenrachner auf 0000 1110 0001 0000 zu 
zerlegen und dann die Register mit

ldi R16, 0b00010000
ldi R17, 0b00001110

Im ersten Fall erledigt das der Assembler für mich.

von michael_ (Gast)


Lesenswert?

Ich habe gerade eine interessante Seite gefunden:
http://www.avr-asm-tutorial.net/avr_de/index.html
Da wirst du sicher fündig.
Oder auch hier:
http://www.atmel.com/Images/doc1022.pdf
Im Studio kommst du über die Hilfe sicher auch dort hin.
In der Annahme, es ist ein AVR.

von Sascha W. (sascha-w)


Lesenswert?

Markus schrieb:
>> Ich habe noch im Internet gelesen, dass bei einem 16 Bit- Wert, nur die
>> Register ab R26 verwendet werden sollen ( anstatt R16,R17 sollen R26,
>> R27).... Ist das so richtig?
kommt darauf an was du machen willst, obersten 6 Register haben auch 
einen Namen mit dem die 16-Bit auf einmal angesprochen werden (X, Y und 
Z). Wenn du mit dem geladenen Wert im Anschluss auf eine Adresse des 
Speichers vom AVR zugreifen willst (lpm - Flash, ld / st - SRAM) dann 
musst du diese Register verwenden. Es gibt auch 2 16-Bit Befehle adiw 
und sbiw die nur mit den oberen 3 Registerpaaren funktionieren.

> Eine Frage noch zum Vergleich von Wertsen.. Wenn man die Inhalte zwei
> Register miteinander vergleicht, dann gibt s den Befehl cp
> z.b. cp R17, R18
Ok

> und dann folgt in den mesiten Beispielen cpc ( wie cp aber mit Carry
> Flag). Ich habe nirgendswo eine ausführliche Erklärung (Carry Flag)
> gefunden. Kann mir jemand sagen was bei cpc gemacht wird?
>
> cp R17, R18
> cpc R19, R20
da der AVR hier keine 16-Bit Befehle hat müssen Berechnugen (auch ein 
Vergleich ist eine Berechnung - nur das das Ergebnis nicht gespeichert 
wird) in zwei 8-Bit Operationen aufgeteilt werden. Liefert jetzt die 
8-Bit Operation einen Übertrag (passiert wenn das Ergebnis >255 oder <0 
wird) so muss dieser bei der Berechnung der zweiten 8-Bit berücksichtigt 
werden. Dazu wird durch die erste Operation das C-Flag (Carry) gesetzt 
und mit dem passenden Befehl (cpc, sbc, adc) der zweiten Operation 
berücksichtigt.

Sascha

von Thomas (kosmos)


Lesenswert?

Das Ergebnis des ersten Vergleichs wird im Carrybit gespeichert und beim 
2ten Vergleich mit einbezogen.

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.