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


von H-G S. (haenschen)


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)


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 (prx) A. K. (prx)


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)


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)


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)


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 (prx) A. K. (prx)


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)


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)


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:

Lesenswert?

Dank an euch alle!

Ich denke ich habe etwas brauchbares zusammengekritzelt  :-)

von Stranero (Gast)


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

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.