![]() |
Assembler: Reihenfolge eines Bitfelds umdrehen
Hallo Leute,
ich such einen einfachen Assembler-Befehl der die Reihenfolge der Bits in einem Byte umdreht: Es soll also aus 12345678 das werden: 87654321 mit den Ziffern meine ich natürlich die Stellen nicht den Wert (Der kann ja nur 0 oder 1 sein). Wer kann mir helfen? Danke TO |
Re: Assembler: Reihenfolge eines Bitfelds umdrehen
BSWAP ist dein Freund.
|
Re: Assembler: Reihenfolge eines Bitfelds umdrehen
Hy,
danke für die schnelle Antwort, leider bringt mich der Tip nicht weiter, denn der Befehl wird von meinem Microkontroller nicht unterstzütz. Es handelt sich hierbei um einen AVR von Atmel, also um einen 8bit-Controller. Sonst noch jemand eine Idee? Danke auf jeden Fall TO |
Re: Assembler: Reihenfolge eines Bitfelds umdrehen
Zitat:
Du kannst es "manuell" machen. Hast du Rotate- und Shift-Befehle zur Verfügung in deinem ASM? Am besten gib mal einen Link zur Prozessordoku. |
Re: Assembler: Reihenfolge eines Bitfelds umdrehen
Hy,
ja, ich gebe zu, ich hätte die Info reinschreiben müßen, sorry. Hier ist eine Befehlsliste für den MC: ![]() Wäre super wenn du mir helfen könntest Gruß und Danke TO |
Re: Assembler: Reihenfolge eines Bitfelds umdrehen
Zitat:
![]() ![]() ![]() |
Re: Assembler: Reihenfolge eines Bitfelds umdrehen
so gehts
Delphi-Quellcode:
sollte also mit einer anweisung getan sein da die zweite hier wohl dazu dient das ganze auf result zu schieben (kenn mich da nicht so aus mit asm)
function RotateLeft(Value: Longint;Rotate: Byte): Longint; assembler;
asm mov cl, dl rol eax, cl end; function RotateRight(Value: Longint; Rotate: Byte): Longint; assembler; asm mov cl, dl ror eax, cl end; |
Re: Assembler: Reihenfolge eines Bitfelds umdrehen
Zitat:
Code:
er will aber (natürlich nur sofern ich das richtig verstanden habe) die bitreihenfolge komplett umdrehen, und das ist nicht so ohne weiteres möglich, dafür brauchts schon ein wenig (aber wirklich nur ein wenig :wink:) mehr
Bit#: 76543210
Bits: 10101100 -------------- rol 2 -------------- Bit#: 76543210 Bits: 10110010 (und es geht net um standard inline-assembler, wie aus der ersten antwort von theomega deutlich wird) |
Re: Assembler: Reihenfolge eines Bitfelds umdrehen
Delphi-Quellcode:
aus meinem DEC,
{reverse the bit order from a integer}
function SwapBits(Value, Bits: LongWord): LongWord; register; asm BSWAP EAX MOV ECX,EAX AND EAX,0AAAAAAAAh AND ECX,055555555h SHR EAX,1 SHL ECX,1 OR EAX,ECX MOV ECX,EAX AND EAX,0CCCCCCCCh AND ECX,033333333h SHR EAX,2 SHL ECX,2 OR EAX,ECX MOV ECX,EAX AND EAX,0F0F0F0F0h AND ECX,00F0F0F0Fh SHR EAX,4 SHL ECX,4 OR EAX,ECX AND EDX,01Fh JZ @@1 MOV ECX,32 SUB ECX,EDX SHR EAX,CL @@1: end; gruß Hagen |
Re: Assembler: Reihenfolge eines Bitfelds umdrehen
[offtopic]
@Hagen: wo ich deinen Assembler-Code gerade so sehe: kann man da an zwei Stellen nicht noch etwas (zugegeben: minimal) optimieren, indem man Zuweisung + links Schieben durch LEA mit Faktor ersetzt? Die beiden Operanden für OR haben ja keine gemeinsamen Bits, also kann man statt dessen auch einfach addieren. (das Semikolon soll einen Kommentar einleiten. Ich weiß jetzt aus dem Kopf nicht mehr, ob der Delphi-Assembler das unterstützt)
Code:
oder (2. Variante)
{reverse the bit order from a integer}
function SwapBits(Value, Bits: LongWord): LongWord; register; asm BSWAP EAX LEA ECX,[2*EAX] ; <-- x2 schon drin ;MOV ECX,EAX AND EAX,0AAAAAAAAh AND ECX,0AAAAAAAAh ; <-- SHR EAX,1 ;SHL ECX,1 ; <-- OR EAX,ECX LEA ECX,[4*EAX] ; <-- x4 schon drin ;MOV ECX,EAX AND EAX,0CCCCCCCCh AND ECX,0CCCCCCCCh ; <-- SHR EAX,2 ;SHL ECX,2 ; <-- OR EAX,ECX MOV ECX,EAX AND EAX,0F0F0F0F0h AND ECX,00F0F0F0Fh SHR EAX,4 SHL ECX,4 OR EAX,ECX AND EDX,01Fh JZ @@1 MOV ECX,32 SUB ECX,EDX SHR EAX,CL @@1: end;
Code:
Ich weiß natürlich nicht, ob das irgendwelche negativen Einflüsse auf den Instruction-Cache hat und die ganze Sache ggf. vielleicht doch langsamer macht.
{reverse the bit order from a integer}
function SwapBits(Value, Bits: LongWord): LongWord; register; asm BSWAP EAX MOV ECX,EAX AND EAX,0AAAAAAAAh AND ECX,055555555h SHR EAX,1 LEA EAX,[EAX+2*ECX] ;<-- Keine gemeinsamen Bits ;SHL ECX,1 ;OR EAX,ECX MOV ECX,EAX AND EAX,0CCCCCCCCh AND ECX,033333333h SHR EAX,2 LEA EAX,[EAX+4*ECX] ;<-- Keine gemeinsamen Bits ;SHL ECX,2 ;OR EAX,ECX ;MOV ECX,EAX LEA ECX,[4*EAX] ;<-- Erstes x4 AND EAX,0F0F0F0F0h AND ECX,03C3C3C3Ch ;<-- SHR EAX,4 LEA EAX,[EAX+4*ECX] ;<-- Zweites x4 ;SHL ECX,4 ;OR EAX,ECX AND EDX,01Fh JZ @@1 MOV ECX,32 SUB ECX,EDX SHR EAX,CL @@1: end; [/offtopic] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz