Assembler High-Byte und low-Byte

Gast #4287125
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
#4287126
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
Gast #4287139
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
#4287149
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
Gast #4287156
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.
Gast #4287162
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
#4287188
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
Gast #4287203
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.
Gast #4287212
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
Gast #4287434
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)....
Gast #4287455
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
#4287474
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.
#4287584
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

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