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 ?
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.
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.
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.
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
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
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
H-G S. schrieb: > Ist da ein 8051-Simulator dabei ? Ja. Nicht allzu komfortabel, geht aber. Für C und auch für ASM.
H-G S. schrieb: > Ist da ein 8051-Simulator dabei ? Für Assembler ist das hier der beste und umsonst: http://www.edsim51.com
Dank an euch alle! Ich denke ich habe etwas brauchbares zusammengekritzelt :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.