Как установить бит в положение?
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
Протестировал и дайте нам знать, если это работает