Я работаю над проектом, и у меня есть следующий код в Assembly (ASM)
//Part #C - Swap half nibbles
xor ebx,ebx //Clears out the staging register
mov ecx,4
halfnibswap1_loop: //Will shift right side into staging register and reverse them
shr al,1
rcl bl,1
loop halfnibswap1_loop
shl bl,4 //Aligns the staging to left to shift them back (in the new reverse order)
mov ecx,4
halfnibswap2_loop: //Will shifts staging back in, swapped
shl bl,1
rcl al,1
loop halfnibswap2_loop
mov ecx,4
halfnibswap3_loop : //Will shift left side into staging register and reverse them
shl al,1
rcr bl,1
loop halfnibswap3_loop
shr bl,4 //Aligns the staging to right to shift them back (in the new reverse order)
mov ecx,4
halfnibswap4_loop: //Will shifts staging back in, swapped
shr bl,1
rcr al,1
loop halfnibswap4_loop
Я начинаю с BD (10111101) в al. То, что я хочу, это E7 (11100111).
По сути, в байте 76543210 должно быть 54761032. (Обмен соседних пар битов.)
Кажется, мой код работает, но я не думаю, что он совершенно правильный и, безусловно, не эффективный. Как бы я сделал это правильно?