2012-03-29 14 views
0

NASM/8086のビットをミラーリングする方法を知っている人はいますか?ミラーリング後レジスタの奇数ビットをミラーリングする

10100001 =>10000101

IレジスタのONLY奇数ビットを反映すべきであるため、問題はより複雑である:ここ

は一例で

意味します。

 10100001 => 00001011 
=>

すなわち1 < => 7および3 < => 5

+0

これはちょうど8ビット値ですか、それとも16,32などにも必要ですか? –

+0

@PaulR彼は宿題のために彼がそれを必要とするのを恐れる:-( – hirschhornsalz

+0

はい、それは一般的には8ビットレジスタだけではありません! – AsamRegnat

答えて

4

明らかアルゴリズムがあるように思われる:

  • 偶数ビット(mask = 01010101...01010101
  • 抽出物のマスクを作成する偶数ビット一時的(temp = src AND mask
  • にから偶数ビットをマスクソースレジスタ(src = src AND NOT mask
  • ソースレジスタの逆方向ビット(plenty of existing algos for this
  • シフトリバースbこれは8ビット値のためだけであれば、その彼らが奇数の場所(src = src SHL 1)に残っているように、もちろん
  • 再挿入してもビット(src = src OR temp

1で左にして、あなただけの前に使用することができます計算された256要素のLUT。

1

最後に、この問題を解決する別の方法を見つけました。あなたの答えはとても良かったですが、問題を解決するのにほんの数分しかかからなかったとき、私は昨日リンクしたアルゴリズムを実装するのが難しいです。私は指定していませんが、この宿題は実際に試験問題であり、限られた時間を要しました。

私はスタンフォード大学のアルゴリズムはより最適化されていますが、実装するのは少し難しいと思いますか、間違っていますか?

だから、ここに私の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     

私は様々な数字でNASM/8086アセンブラでこのソリューションを検証し、それが動作! :P

+0

修正のおめでとう!あなたができるときは、あなたの答えが「受け入れられた」とマークして、あなたの質問が答えられ、あなたの解決策から学ぶことができるようにしてください。乾杯〜 –

+0

これは単純な "ブルートフォース"のように見えますが、それが機能する限り、それはおそらくすべて重要です。 –

関連する問題