Консультация № 189200
15.04.2016, 18:30
0.00 руб.
0 3 2
Здравствуйте! Прошу помощи в следующем вопросе:
Дано число в двоичном виде. Поменять местами пятый бит с седьмым . Результат разделить на 8 и проинвертировать.
Прошу помощи т.к ни черта ни черта не смыслю в ассемблере.

Обсуждение

давно
Посетитель
7438
7205
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]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
15.04.2016, 20:38
общий
это ответ
Здравствуйте, romanevdokimov1!

Самая сложная часть, обмен битов сделана только операциями сдвигов.
[code lang=asm h=200]model tiny
.code
org 100h
start: mov bx,10000000b;
call @@00
rol bx,1
call @@00
rol bl,1
call @@00
rol bl,1
call @@00
ror bx,1
call @@00
ror bl,1
call @@00
rol bh,1
call @@00
ror bx,1
call @@00
sub bx,8
call @@00
xor bx,0FFh
;вывод слова
@@00: mov di,bx
mov al,10
int 29h
mov al,13
int 29h
call @@01
@@01: mov al,' '
int 29h
mov cx,8
@@02: xor al,al
shl di,1
adc al,'0'
int 29h
loop @@02
ret
end start[/code]
Меняя значение того или иного бита, можно посмотреть как он движется в слове.
Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
15.04.2016, 20:45
общий
Адресаты:
Выглядит так для 7-го и 5-го битов.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа