Как установить бит в положение?

mov al, 100d ; 01100100
shr eax, 1 ; cf = 0
           ; 00110010

Как сжечь cf в 5-й позиции?

Например: мой номер 10000111. CF = 1 => 10001111

Моя основная задача - сделать обратный байт, используя shr (shl). Я хочу сделать это сам, но я не знаю, как установить бит в положение

2 ответа

Решение

Для обращения битов просто сдвиньте их в операнд-адресат с того же конца, с которого вы переместили их из источника (то есть используйте противоположные сдвиги). Образец кода:

    mov al, 100  ; input = 01100100
    mov ah, 0    ; output
    mov ecx, 8   ; 8 bits to process
next:
    shr al, 1    ; shift next bit out to the right
    rcl ah, 1    ; shift it in from the right
    loop next
    ; result in ah = 38 = 0010 1100

Тем не менее, чтобы ответить на ваш вопрос: сдвиньте перенос в обнуляемый временный регистр на заданную позицию, затем используйте побитовый OR установить его в пункте назначения. Образец кода:

mov dl, 0 ; zero temp register, without affecting CF
rcl dl, 5 ; move CF into bit #5 (use CL register for dynamic)
or al, dl ; merge into al

"...но я не знаю, как установить бит в положение..."

Понятный. Есть миллион инструкций.

Первый, SHR (а также SHL, игнорируемый для этого обсуждения), который вы выбрали для использования, будет перебирать флаг переноса, чтобы содержать бит на границе (регистра источника), которую вы сдвинули.

Есть еще одна инструкция, RCL (а также RCRаналогичным образом игнорируется в этом обсуждении), который поместит бит переноса в бит на другом краю (целевого регистра), который вы, так сказать, "сдвинете"

Сделайте это восемь раз подряд, и вы закончите процедуру "реверс-матика".

Вот две страницы, которые описывают эти две инструкции, включая небольшую картинку...

Пингвин объясняет инструкции SHR

Пингвин объясняет инструкцию RCL

Эй, это легко, так что бесплатный код, только потому, что я чувствую себя хорошо сегодня...

    Mov     AL,Some_Number          ;Define this somewhere
    Sub     AH,AH                   ;Not really needed, placed here to help newcomers understand

    SHR     AL,1                    ;Get the bottom bit (bit #0) from AL
    RCL     AH,1                    ;Put it into the top bit of AH

    SHR     AL,1                    ;Now get bit #1
    RCL     AH,1                    ;Put it into the top bit of AH

    SHR     AL,1                    ;Now get bit #2
    RCL     AH,1                    ;Put it into the top bit of AH

    SHR     AL,1                    ;Now get bit #3
    RCL     AH,1                    ;Put it into the top bit of AH

    SHR     AL,1                    ;Now get bit #4
    RCL     AH,1                    ;Put it into the top bit of AH

    SHR     AL,1                    ;Now get bit #5
    RCL     AH,1                    ;Put it into the top bit of AH

    SHR     AL,1                    ;Now get bit #6
    RCL     AH,1                    ;Put it into the top bit of AH

    SHR     AL,1                    ;Now get bit #7
    RCL     AH,1                    ;Put it into the top bit of AH

    Mov     Reverse_Pattern,AH      ;The pattern is now exactly backwards

Протестировал и дайте нам знать, если это работает

Другие вопросы по тегам