NASM/8086のビットをミラーリングする方法を知っている人はいますか?ミラーリング後レジスタの奇数ビットをミラーリングする
10100001
=>10000101
IレジスタのONLY奇数ビットを反映すべきであるため、問題はより複雑である:ここ
は一例で
意味します。
10100001 => 00001011
=>
すなわち1 < => 7および3 < => 5
NASM/8086のビットをミラーリングする方法を知っている人はいますか?ミラーリング後レジスタの奇数ビットをミラーリングする
10100001
=>10000101
IレジスタのONLY奇数ビットを反映すべきであるため、問題はより複雑である:ここ
は一例で
意味します。
10100001 => 00001011
=>
すなわち1 < => 7および3 < => 5
明らかアルゴリズムがあるように思われる:
mask = 01010101...01010101
)temp = src AND mask
)src = src AND NOT mask
)src = src SHL 1
)に残っているように、もちろんsrc = src OR temp
)1で左にして、あなただけの前に使用することができます計算された256要素のLUT。
最後に、この問題を解決する別の方法を見つけました。あなたの答えはとても良かったですが、問題を解決するのにほんの数分しかかからなかったとき、私は昨日リンクしたアルゴリズムを実装するのが難しいです。私は指定していませんが、この宿題は実際に試験問題であり、限られた時間を要しました。
私はスタンフォード大学のアルゴリズムはより最適化されていますが、実装するのは少し難しいと思いますか、間違っていますか?
だから、ここに私の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
修正のおめでとう!あなたができるときは、あなたの答えが「受け入れられた」とマークして、あなたの質問が答えられ、あなたの解決策から学ぶことができるようにしてください。乾杯〜 –
これは単純な "ブルートフォース"のように見えますが、それが機能する限り、それはおそらくすべて重要です。 –
これはちょうど8ビット値ですか、それとも16,32などにも必要ですか? –
@PaulR彼は宿題のために彼がそれを必要とするのを恐れる:-( – hirschhornsalz
はい、それは一般的には8ビットレジスタだけではありません! – AsamRegnat