15.04.2016, 19:05
общий
это ответ
Здравствуйте, romanevdokimov1!
Держите программку
[code lang=asm h=200]
.186 ;чтобы можно было использовать сдвиги
; на больше, чем один бит
code segment
assume cs:code
main:
mov bl, 10001001b ;исходный байт
call print_bits ;выведем на экран
call change_bits ;меняем местами 5 и 7 биты (считаем с 0!)
call print_bits ;выведем на экран, что получилось
shr bl, 3 ;разделим на 8 сдвигом вправо на 3 бита
call print_bits ;выведем на экран, что получилось
not bl ;инвертируем биты
call print_bits ;выведем на экран, что получилось
mov ah, 0 ;ждем нажатие на клавишу
int 16h
mov ax,4c00h ;выход
int 21h
print_bits proc ;вывод побитно байта bl
push bx ;сохраним в стеке
mov cx, 8 ;8 бит
mov ah, 2 ;ф-я вывода на экран
print_bits_loop:
shl bl, 1 ;старший бит уходит в С
mov dl, '0' ;или '0' или '1'
adc dl, 0 ;добавим бит С
int 21h ;выводим
loop print_bits_loop ;по всем битам
mov dl, 0dh ;перевод строки
int 21h
mov dl, 0ah
int 21h
pop bx
ret
print_bits endp
change_bits proc ;обмен 5 и 7 битами в байте bl
mov al, bl
shr al, 2 ;бит 7 сдвигаем на место 5 бита
and al, 00100000b ;выделяем по маске 5 бит
mov ah, bl
shl ah, 2 ;бит 5 сдвигаем на место 7 бита
and ah, 10000000b ;выделяем по маске 7 бит
and bl, 01011111b ;обнуляем старые 5 и 7 биты
or bl, al ;добавляем старый 7 на месте 5 бита
or bl, ah ;добавляем старый 5 на месте 7 бита
ret
change_bits endp
code ends
end main
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен