Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Boriss
Статус: Академик
Рейтинг: 2670
∙ повысить рейтинг »
Жерар
Статус: Профессор
Рейтинг: 2425
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2246
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1458
Дата выхода:03.06.2011, 18:33
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:215 / 63
Вопросов / ответов:1 / 1

Вопрос № 183398: Здравствуйте, уважаемые эксперты! Прошу Вас помочь в написании этой программы: Дана двухбайтовая двоичная строка. Сформировать новую строку, в которой каждый бит строки заменен суммой по модулю 2 данного бита и двух его соседей справа. Cпасибо.


Вопрос № 183398:

Здравствуйте, уважаемые эксперты! Прошу Вас помочь в написании этой программы: Дана двухбайтовая двоичная строка. Сформировать новую строку, в которой каждый бит строки заменен суммой по модулю 2 данного бита и двух его соседей справа.
Cпасибо.

Отправлен: 29.05.2011, 18:14
Вопрос задал: Илья Андреевич (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Илья Андреевич!
Вот Вам программа, решающая Вашу задачу

Код :
;Дана двухбайтовая двоичная строка. Сформировать новую строку, 
;в которой каждый бит строки заменен суммой по модулю 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 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное