.model small
.data
num dd 00000000000000001101010110101010b
.code
.386
start:
mov ax, @data
mov ds, ax
mov eax, num ;наше число
mov cl, 15 ;номер первого бита (счет с 0)
mov ch, 16 ;номер второго бита (счет с 0)
call ChangeBits ;меняем биты в eax
mov num, eax ;сохраняем результат
mov ax, 4c00h
int 21h
;меняем местами два бита врегистре eax,
;номера бит заданы в cl и ch
ChangeBits proc
;сформируем маску первого бита
mov edx, 1 ;поставим 1 в нужную позицию
shl edx, cl ;номер бита будет число, на которое надо сдвинуть
;сформируем маску второго бита
mov cl, ch ;его номер
mov ebx, 1
shl ebx, cl ;маска бита в ebx
;сформируем общую маску двух бит
or edx, ebx
;проверим, какие биты на указанных местах
mov ecx, eax ;наше число
and ecx, edx ;оставляем только нужные биты
jz CBret ;если оба нуля, то менять местами не надо
cmp ecx, edx ;если равны маске, значит оба единицы,
jz CBret ;также не меняем
xor eax, edx ;если разные, то операцией xor с единицами меняем местами
CBret:
ret
ChangeBits endp
end start
cb proc ;wwwwwwwx yzzzzzzz,_
shl ax, 1 ;wwwwwwwx zzzzzzz_,y
rcl dl, 1 ;_______y,_
rol eax, 16 ;zzzzzzz_ wwwwwwwx,_
shr ax, 1 ;zzzzzzz_ _wwwwwww,x
rcr dl, 1 ;x_______,y
rcl ax, 1 ;zzzzzzz_ wwwwwwwy,_
rol eax, 16 ;wwwwwwwy zzzzzzz_,_
shl dl, 1 ;________,x
rcr ax, 1 ;wwwwwwwy xzzzzzzz,_
ret
cb endp
;меняем местами два бита в регистре eax,
;номера бит заданы в cl и ch
cb1 proc
;задаем маску очистки по and для первого бита
mov esi, 1
shl esi, cl ;1 в нужной позиции
not esi ;0 в нужной позиции
;сформируем маску установки по or для второго бита
mov edx, eax ;наше число
shr edx, cl ;первый бит стал, как нулевой
and edx, 1 ;оставляем только 0 бит
xchg cl, ch ;и вдвигаем его на позицию второго
shl edx, cl ;в edx на позиции второго бита бывший первый
;задаем маску очистки по and для второго бита
;в cl позиция второго
mov edi, 1
shl edi, cl ;1 в нужной позиции
not edi ;0 в нужной позиции
;сформируем маску установки по or для первого бита
mov ebx, eax ;наше число
shr ebx, cl ;второй бит стал, как нулевой
and ebx, 1 ;оставляем только 0 бит
xchg cl, ch ;и вдвигаем его на позицию первого
shl ebx, cl ;в ebx на позиции первого бита бывший второй
;маски сформированы, подправим число
and eax, esi ;сбросим первый бит
and eax, edi ;сбросим второй бит
or eax, edx ;вставим первый на место второго
or eax, ebx ;вставим второй на место первого
ret
cb1 endp
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.