Hallo uC-Gemeinde, ich habe in einem laufenden Projekt eine Herausforderung. Das Protokoll einer Datenübertragung muss geändert/erweitert werden. Ich habe allerdings im uC nicht mehr viel Platz und suche deshalb einen kleinen ASM-Code. Umwandlung von 3 x 16 Bit Zahlen in 4 x 12 Bit Zahlen und umgekehrt. Die Datenübertragung von 3 x 16 Bit ist festgelegt. F 0 F 0 F 0 +-------------------+-------------------+-------------------+ | Old1 | Old2 | Old3 | +---------+---------+---------+---------+---------+---------+ | HWord | LWord | HWord | LWord | HWord | LWord | +----+----+----+----+----+----+----+----+----+----+----+----+ | | | | | | | | | | | | | +----+----+----+----+----+----+----+----+----+----+----+----+ C 0 C 0 C 0 C 0 +--------------+--------------+--------------+--------------+ | New1 | New2 | New3 | New4 | +--------------+--------------+--------------+--------------+ Für eine Richtung müsste es so funktionieren: Old1_HWord = New1 >> 4 Old1_LWord = ((New1 & 0x00F) << 4) + (New2 >> 8) Old2_HWord = New2 & 0x0FF Old2_LWord = New3 >> 4 Old3_HWord = ((New3 & 0x00F) << 4) + (New3 >> 8) Old3_LWord = New4 & 0x0FF Plattform ASM MCS51/MCS52. Optimiert nach Codegrösse. Geschwindigkeit sekundär. Frage: - Ist das so richtig? - Geht das in ASM für MCS51/52 kleiner/einfacher - Wie sieht das in der entgegengesetzten Richtung aus Vielen Dank für eure Ideen und Vorschläge, Grüsse aus dem kalten Berlin Rene
Rene Schube schrieb: > - Wie sieht das in der entgegengesetzten Richtung aus Die andere Richtung sieht ähnlich aus (ist aber ungetestet):
1 | New1 = (Old1_HWord << 4) | (Old1_LWord >> 4); |
2 | New2 = (Old1_LWord << 8) | Old2_HWord; |
3 | New3 = (Old2_HWord << 4) | (Old2_LWord >> 4); |
4 | New4 = (Old2_LWord << 8) | Old3_HWord; |
Danke für die schnelle Rückmeldung. Ich werde mich mal dran setzten und das in ASM austesten.
Hallo, vielleicht ein kleiner Tipp von mir wenn du es vor hast im Assembler umzusetzen: statt 4-mal verschieben würde ich den swap-Befehl verwenden der die Nibbles eines Bytes vertauscht, damit wird der gesamtcode auch kürzer.
Danke, das habe ich schon im Hinterkopf. Ich frimmel den ASM-Code zusammen und stelle den dann hier rein...
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.