2014-09-15 2 views
1
mov al, 100d ; 01100100 
shr eax, 1 ; cf = 0 
      ; 00110010 

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

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

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

ответ

1

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

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 
+0

Не понимаю. Можете ли вы привести пример? – ales

1

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

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

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

Существует еще одна инструкция, RCLRCR, так же игнорируется для обсуждения этого вопроса), который поставит бит переноса в бит на другом краю (целевой регистр), который вы «сдвиг», так сказать

Выполняйте это восемь раз подряд, и у вас будет выполнен «обратный o-matic».

Вот две страницы, которые описывают эти две команды, в том числе маленькой картинке ...

Penguin Explains SHR instruction

Penguin Explains RCL instruction

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

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 

Испытано его и дайте нам знать, если это работает

+1

Я не знал о существовании RCL. Спасибо. – ales