Вопрос о замене половинных кусков - PullRequest
0 голосов
/ 11 апреля 2019

Я работаю над проектом, и у меня есть следующий код в 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. (Обмен соседних пар битов.)

Кажется, мой код работает, но я не думаю, что он совершенно правильный и, безусловно, не эффективный. Как бы я сделал это правильно?

1 Ответ

4 голосов
/ 11 апреля 2019

Вот одна из возможных реализаций в 5 инструкциях:

lea ebx,[eax*4]   ; ebx = eax*4 (i.e. eax << 2): 76543210 -> 543210..
and bl,0xCC       ; 543210.. -> 54..10..
shr al,2          ; al >>= 2: 76543210 -> ..765432
and al,0x33       ; ..765432 -> ..76..32
or al,bl          ; al = 54761032
...