Forum: Mikrocontroller und Digitale Elektronik 8051 Zwei 16-Bit-Werte testen ob größer/kleiner/gleich


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von H-G S. (haenschen)


Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich müsste für ein Speicher-Kopier-Programm (auf dem 8051er) testen ob 
zwei eingegebene 16-Bit-Adressen (Wörter) im gültigen Bereich sind. Das 
zweite Wort darf nicht kleiner oder gleich dem ersten Wort sein - später 
muss geprüft werden ob das zweite Wort mehr als 32kB weit weg ist vom 
ersten Wort.

Aber erstmal muss das zweite Wort größer sein als das erste Wort.

Adresse 38h/39h sind das erste Wort (H/L).
Adresse 3Ah/3Bh sind das zweite Wort (H/L).



Subtrahieren kann ich schonmal mit:

MOV A,3Bh
CLR C
SUBB A,39h
MOV R5,A
MOV A,3Ah
SUBB A,38h
MOV R4,A

Das Ergebnis von Wort 2 minus Wort 1 steht dann in R4/R5 (H/L).



Weiss jemand wie man effizient zwei Wörter auf größer als prüfen kann ?

von Heinz V. (heinz_v)


Bewertung
0 lesenswert
nicht lesenswert
Erstmal beide HighBytes vergleichen, wenn davon eins grösser ist der 
Vergleich eindeutig und die LowBytes uninteressant, wenn die HighBytes 
gleich, dann die LowBytes prüfen, so würde ich das machen.

von A. K. (prx)


Bewertung
0 lesenswert
nicht lesenswert
H-G S. schrieb:
> Das Ergebnis von Wort 2 minus Wort 1 steht dann in R4/R5 (H/L).

Und der </>= Status steht im C-Flag.

von Georg G. (df2au)


Bewertung
0 lesenswert
nicht lesenswert
Ein sehr bequemer Weg ist es, das Problem in C zu schreiben und den 
Compiler um die Ausgabe des Assembler Codes zu bitten.
Für den MCS51 bietet sich die kostenlose Version von Keil an.

von H-G S. (haenschen)


Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> H-G S. schrieb:
>> Das Ergebnis von Wort 2 minus Wort 1 steht dann in R4/R5 (H/L).
>
> Und der </>= Status steht im C-Flag.

Heisst dass das nach der Subtraktion der Highbytes noch ein Carry-Flag 
zur Auswertung bereitsteht ? Das eventuelle Carry-Borrow von der 
Lowbyte-Subtraktion wurde ja verbraucht ...

Georg G. schrieb:
> Für den MCS51 bietet sich die kostenlose Version von Keil an.

Ist da ein 8051-Simulator dabei ?

Heinz V. schrieb:
> Erstmal beide HighBytes vergleichen, wenn davon eins grösser ist der
> Vergleich eindeutig und die LowBytes uninteressant, wenn die HighBytes
> gleich, dann die LowBytes prüfen, so würde ich das machen.

Das klingt gut ...

: Bearbeitet durch User
von Klaus (Gast)


Bewertung
-2 lesenswert
nicht lesenswert
Georg G. schrieb:
> Ein sehr bequemer Weg ist es, das Problem in C zu schreiben und den
> Compiler um die Ausgabe des Assembler Codes zu bitten.

Noch bequemer ist es, das ganze Programm in C zu schreiben und sich den 
Assembler Code gar nicht anzuschauen.

MfG Klaus

von A. K. (prx)


Bewertung
1 lesenswert
nicht lesenswert
H-G S. schrieb:
> Heisst dass das nach der Subtraktion der Highbytes noch ein Carry-Flag
> zur Auswertung bereitsteht ?

Ja. Kannst es auch Borrow nennen. Je nach Architektur und damit der 
Arbeitsweise des Flags bei der Subtraktion steht ein gesetztes C für >= 
oder < der Gesamtoperation.

Hintergrund: Dass nach einer einzelnen Subtraktion das Carry/Borrow Flag 
für </>= steht, ist vielleicht bekannt. Wenn du diese Subtraktion auf 
Bitebene betrachtest, dann ist es dafür völlig egal, ob du alle Bits in 
einem Rutsch rechnest oder jedes einzeln.

: Bearbeitet durch User
von Georg G. (df2au)


Bewertung
0 lesenswert
nicht lesenswert
H-G S. schrieb:
> Ist da ein 8051-Simulator dabei ?

Ja. Nicht allzu komfortabel, geht aber. Für C und auch für ASM.

von Lothar (Gast)


Bewertung
0 lesenswert
nicht lesenswert
H-G S. schrieb:
> Ist da ein 8051-Simulator dabei ?

Für Assembler ist das hier der beste und umsonst:

http://www.edsim51.com

von H-G S. (haenschen)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Dank an euch alle!

Ich denke ich habe etwas brauchbares zusammengekritzelt  :-)

von Stranero (Gast)


Bewertung
1 lesenswert
nicht lesenswert
CLR C
MOV A,low_byte_1
SUBB A,low_byte_2
MOV A,high_byte_1
SUBB A,high_byte_2
JNC Kleiner

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.