2012-03-29 3 views
0

Kann jemand in NASM/8086 Bits spiegeln? HierSpiegelung von ungeraden Bits eines Registers

ein Beispiel:

10100001 nach Spiegelung =>10000101

Das Problem ist komplizierter, weil ich nur die ungeraden Bits eines Registers spiegeln sollte:

Das bedeutet:

 10100001 => 00001011 
=>

dh 1 < => 7 und 3 < => 5

+0

Ist dies nur für 8-Bit-Werte, oder benötigen Sie es auch für 16, 32, etc? –

+0

@PaulR Ich fürchte, er braucht es für die Hausaufgaben :-( – hirschhornsalz

+0

Ja, es ist in der Regel nicht nur für 8-Bit-Register! – AsamRegnat

Antwort

4

Der offensichtliche Algorithmus scheint zu sein:

  • Maske erstellen von geraden Bits (mask = 01010101...01010101)
  • Extrakt sogar Bits in eine temporäre (temp = src AND mask)
  • maskieren sogar Bits aus Quellenregister (src = src AND NOT mask)
  • Rückwärtsbits im Quellenregister (plenty of existing algos for this)
  • Verschiebung rückwärts b links daneben um 1, so dass sie immer noch in ungeraden Positionen (src = src SHL 1)
  • Wiedereinsatz auch Bits (src = src OR temp)

Natürlich sind, wenn dies nur für 8-Bit-Werte dann könnte man nur eine prä- verwenden berechnete 256-Element-LUT.

1

Ich finde endlich einen anderen Weg, um das Problem zu lösen. Ihre Antwort war sehr gut, aber der Algorithmus, mit dem Sie mich gestern verbunden haben, ist schwer zu implementieren, wenn Sie nur wenige Minuten Zeit haben, das Problem zu lösen. Ich habe nicht angegeben, aber diese Hausaufgaben waren in der Tat ein Prüfungsproblem mit begrenzter Zeit.

Ich denke, dass der Algorithmus von der Stanford University ist es mehr optimiert, aber ein wenig schwierig zu implementieren, oder liege ich falsch ?!

So, hier ist mein Ideea:

MOV EAX,2862962005 ; Register where the odd bits must be mirrored 
        ; Initialised with an random Number as example 
        ; Result should be putted again in EAX 

ODD_MIRRORED: 
PUSH EBX   ;put the values of the other registers on to the Stack 
PUSH ECX   ;probably this registers hold valuable datas inside 
PUSH EDX 

MOV EDX,0   ;EDX is counter, form 0 to 31 
MOV EBX,0   ;EBX holds the inverted odd bits during the process 
        ;For Auxiliary use only 

iteration: 
ROR EAX,1   ;EVEN VALUE? JUMP: EAX rotated to the right 
ROL EBX,1   ;     EBX rotated to the left (for mirroring) 
INC EDX    ;     counter incremented 

MOV ECX,0x00000001 ;ODD VALUE? USE mask and extract only one odd value 
        ;from EAX at a given time 
AND ECX,EAX   
OR EBX,ECX   ;put the value in EBX 
ROR EAX,1   ;EAX rotated to the right 
ROL EBX,1   ;EBX rotated to the left (for mirroring) 
INC EDX    ;counter incremented again 

CMP EDX,31   
JGE end    ;if counter is greater or equal 31 jump at the end of the program 

JMP iteration 

end: 
        ;now EAX was rotated to the initial position 
AND EAX,0x55555555 ;we want only just to get away from old odd values with 
        ;the mask 0x55555555 (0101), which is deleting the odd values 
OR EAX,EBX   ;finally we transfer the mirrored odd bits into EAX from the 
        ;auxiliary variable EBX 

POP EDX    ;restore EBX,ECX,EDX 
POP ECX 
POP EBX 
RET     

ich diese Lösung in NASM/8086 Assembler mit verschiedenen Zahlen überprüft und es funktioniert! : P

+0

Herzlichen Glückwunsch zum Fix! Wenn Sie dazu in der Lage sind, achten Sie bitte darauf, Ihre Antwort als "akzeptiert" zu markieren, damit andere Ihre Frage beantwortet sehen und von Ihrer Lösung lernen können. Cheers ~ –

+0

Gut gemacht - es sieht so aus, als ob dies eine einfache "Brute-Force" -Methode ist, aber solange es funktioniert, ist das wahrscheinlich alles, worauf es ankommt. –