Forum: Mikrocontroller und Digitale Elektronik BRGE-Befehl unklar


von J. T. (chaoskind)


Lesenswert?

Moin Moin,

ich hab mal wieder ein kleines Problem mit meinem Mega32...

Es geht um den BRGE-Befehl.
1
freqschleife:
2
3
      out   portc,wf
4
      inc    wf
5
      cpi    freq,1
6
      brge  freqcount
7
      rjmp  freqschleife
8
9
      freqcount:
10
11
        mov    a1,freq
12
13
        fc:
14
15
        dec    a1
16
        brne  fc
17
        rjmp  freqschleife

Wenn freq 0 ist, soll er sich die freqcount-schleife sparen... das 
klappt aber nur, solang freq nicht größer als 0x7F wird, bei 0x80 
verzweigt er nicht mehr... Also nach meinen Mathematikverständniss ist 
0xFF auch größer als 0x01... Für erklärende Antworten wäre ich sehr 
dankbar. =)

MfG, des Chaoskind

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

jendrik t. schrieb:
> Also nach meinen Mathematikverständniss ist
> 0xFF auch größer als 0x01...

Was ist ein "Verständniss"?

Sieh Dir mal an, was das Zweierkomplement ist. Ja, genau: Negative 
Zahlen, wenn Bit7 gesetzt ist. 0x80 ist also negativ.

http://de.wikipedia.org/wiki/Zweierkomplement

von Vlad T. (vlad_tepesch)


Lesenswert?

Auszug aus dem DatenblatT:

> BRGE  k Branch if Greater or Equal, Signed

dämmerts?

edit:
zu spät

von Albert S. (Gast)


Lesenswert?

jendrik t. schrieb:

> [...] solang freq nicht größer als 0x7F wird, bei 0x80
> verzweigt er nicht mehr... Also nach meinen Mathematikverständniss ist
> 0xFF auch größer als 0x01... Für erklärende Antworten wäre ich sehr
> dankbar. =)

Ich habe von Assembler keine Ahnung, aber das sieht aus als wäre die 
Variable ein signed 8-bit Integer.

In dem Fall gibt das erste Bit das Vorzeichen an.

Bis 0x7F ist es eine 0 und damit positiv, ab 0x80 ist es eine 1 und 
damit negativ.

Somit ist die Dezimalzahl kleiner.

von Fred S. (kogitsune)


Angehängte Dateien:

Lesenswert?

Die Lösung wird Dir klar werden, wenn Du Dir den mit Vorzeichen 
behafteten (!) Befehl BRGE im Detail anschaust (siehe Bild).

von Fred S. (kogitsune)


Lesenswert?

Die Bildschirmkopie anzufertigen, hat dann doch etwas zu lange gedauert 
-- die anderen waren schneller!

von Uwe (Gast)


Lesenswert?

signed und unsigned bitte unterscheiden. Wenn bit 7 1 ist, dann ist die 
Zahl negativ. 0x80 ist also -128. Zweierkomplement.
In der Instructionset Tabelle von Atmel stehen die Flags die beachtet 
werden
 und welche Operation ausgeführt wird. Bei einen cpi wird auch nur 
subtrahiert und die Flags ausgewertet ohne ein ergebnis ins Zielregister 
zu schreiben.

von Karl H. (kbuchegg)


Lesenswert?

Und auch das
AVR-Tutorial
ist immer einen Blick wert, ob es da nicht etwas dazu gibt.

Konkret ist es der Artikel "Vergleiche"
AVR-Tutorial: Vergleiche

Und da wiederrum der Abschnitt "Bedingte Sprünge für vorzeichenlose 
Zahlen"


Du willst einen
BRSH
benutzen.

von J. T. (chaoskind)


Lesenswert?

Vielen Dank für die schnellen Antworten, die mir sehr geholfen haben =)!

2er Komplement, das erklärt einiges, ich war schon am verzweifeln, wo er 
mein höchstes bit hintut *g. Mit dem BRSH tut er genau das, was ich 
wollte.

Bis zum nächsen mal, das chaoskind

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Anstatt BRSH geht dann auch BRNE, denn x ≥ 1 ich gleichbedeutend 
mit x ≠ 0

Und es geht auch ein CPSE wenn man ein Register übrig hat:
1
    clr   zero
2
3
freqschleife:
4
    out   portc, wf
5
    inc   wf
6
    cpse  freq, zero
7
    rjmp  freqschleife
8
9
freqcount:
10
    ...

Übrigens wird freq in der Schleife nie geändert.

von Vlad T. (vlad_tepesch)


Lesenswert?

Johann L. schrieb:
> Anstatt BRSH geht dann auch BRNE, denn x ≥ 1 ich gleichbedeutend

wobei die Namenswahl für die Mnemonics auch katastrophal ist.

BRGE  branch if greater or equal
BRSH  branch if same or higher

Hallo?
warum hat man nicht einfach noch einen Suffix drangehangen, ob signed 
oder unsigned

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.