Вопрос № 183398: Здравствуйте, уважаемые эксперты! Прошу Вас помочь в написании этой программы: Дана двухбайтовая двоичная строка. Сформировать новую строку, в которой каждый бит строки заменен суммой по модулю 2 данного бита и двух его соседей справа. Cпасибо. Вопрос № 183398:
Здравствуйте, уважаемые эксперты! Прошу Вас помочь в написании этой программы: Дана двухбайтовая двоичная строка. Сформировать новую строку, в которой каждый бит строки заменен суммой по модулю 2 данного бита и двух его соседей справа. Cпасибо.
Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Илья Андреевич! Вот Вам программа, решающая Вашу задачу
Код :
;Дана двухбайтовая двоичная строка. Сформировать новую строку,
;в которой каждый бит строки заменен суммой по модулю 2
;данного бита и двух его соседей справа
.model small
.stack 100h
.data
bstring dw 1011001111100010b ;наша строка
;подпрограммы отработки для каждого бита
bitProgram dw bit_0_Pr, bit_1_Pr, bit_15_2_Pr, bit_15_2_Pr
dw bit_15_2_Pr, bit_15_2_Pr, bit_15_2_Pr, bit_15_2_Pr
dw bit_15_2_Pr, bit_15_2_Pr, bit_15_2_Pr, bit_15_2_Pr
dw bit_15_2_Pr, bit_15_2_Pr, bit_15_2_Pr, bit_15_2_Pr
sSrc db 'Source string: $'
sXored db 0dh,0ah,'Xored string: $'
sAny db 0dh,0ah,'Press any key$'
.code
main proc
mov ax, @DATA
mov ds, ax ;настроим сегмент данных
mov di, bstring ;входная двоичная строка
xor cx, cx ;номер бита
xor bx, bx ;выходная двоичная строка
BitsLoop:
mov si, cx ;сформируем смещение п/п для бита
shl si, 1 ;по 2 байта
call bitProgram[si] ;отработаем, в результате, в ax новый бит
or bx, ax ;формируем выходную строку побитно
inc cx ;по всем битам
cmp cx, 16 ;0-15
jb BitsLoop
lea dx, sSrc ;выведем исходную строку
mov ah, 9
int 21h
mov ax, bstring ;строка-слово
call PrintBin ;выведем в виде строки бит
lea dx, sXored ;результат
mov ah, 9
int 21h
mov ax, bx ;выходная строка
call PrintBin
lea dx, sAny ;press any key
mov ah, 9
int 21h
mov ah, 0 ;ждем any key
int 16h
mov ax,4c00h ;выход в ДОС
int 21h
main endp
;п/п возвращает в ax новое значение бита, номер которого в cx, в di - исходная строка
bit_15_2_Pr proc ;подпрограмма xor-а бита 2-15 с двумя соседями справа
dec cx ;возьмем "соседа соседа"
dec cx ;cx - его номер
mov ax, di ;исходная строка
shr ax, cl ;бит 0 - значение бита "соседа соседа"
inc cx ;номер бита "соседа"
mov si, di ;исходная строка
shr si, cl ;бит 0 - значение бита "соседа"
xor ax, si ;ax.0 = xor битов соседей справа
bit_current:
inc cx ;текущий бит
mov si, di
shr si, cl ;бит 0 - значение текущего бита
xor ax, si ;ax.0 = xor всех битов
and ax, 1 ;оставим только один 0 бит
shl ax, cl ;и задвинем его на свое место
ret
bit_15_2_Pr endp
;п/п возвращает в ax новое значение бита, номер которого в cx, в di - исходная строка
bit_1_Pr proc ;подпрограмма xor-а бита 1 с соседом справа
dec cx ;номер бита "соседа"
mov ax, di ;исходная строка
shr ax, cl ;бит 0 - значение бита "соседа"
jmp bit_current ;обработаем текущий бит
bit_1_Pr endp
;п/п возвращает в ax значение 0 бита (он не меняется, у него нет соседей)
bit_0_Pr proc
mov ax, di
and ax, 1
ret
bit_0_Pr endp
;п/п вывода слова ax в виде последовательности бит
PrintBin proc
mov cx, 16 ;число бит
mov si, ax ;сохраним в si
mov ah, 2 ;ф-я вывода символа на экран
PrintBitLoop:
rcl si, 1 ;сдвинем старший бит в С
mov dl, '0' ;символ '0'
adc dl, 0 ;добавим к '0' бит С, получим '0' или '1'
int 21h ;выведем
loop PrintBitLoop
mov dl, 'b' ;в конце добавим 'b'
int 21h
ret
PrintBin endp
end main
Вывод программы:
Код :
Source string: 1011001111100010b
Xored string: 0001101110101110b
Press any key
----- Люби своего ближнего, как самого себя
Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 31.05.2011, 12:45
Номер ответа: 267484 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 267484
на номер 1151 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.