Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты данной рассылки Номер выпуска: | 1411 | Дата выхода: | 01.01.2011, 06:30 | Администратор рассылки: | Лысков Игорь Витальевич (Старший модератор) | Подписчиков / экспертов: | 221 / 68 | Вопросов / ответов: | 2 / 2 | Вопрос № 181633: Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: Серию импульсов Q[1..32] (Qi={0,1}) преобразовать в один импульс P[1..32] с параметрами: Вопрос № 181634: Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: Серию импульсов Q[1..32] (Qi={0,1}) преобразовать в один импульс P[1..32] с параметрами: Вопрос № 181633: Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: Серию импульсов Q[1..32] (Qi={0,1}) преобразовать в один импульс P[1..32] с параметрами:
 .286 Отправлен: 27.12.2010, 05:52 Вопрос задал: lanc1k (Посетитель) Всего ответов: 1 Страница вопроса » Отвечает Лысков Игорь Витальевич (Старший модератор) : Здравствуйте, lanc1k! Вот и программа. Будут вопросы, обращайтесь в мини-форум
Код: N equ 32 ;размер массива
.model small .code start: ;точка входа mov ax, @data ;загрузим сегментные регистры сегментом данных mov ds, ax mov es, ax
call GetPulse ;Вводим ровно 32 нулей и единиц
call ModifyPulse ;модифицируем
call PutPulse ;выводим Exit: lea dx, sPress ;выведем приглашение нажать на Escape mov ah, 9 int 21h
WaitKey: mov ah, 0 ;ждем int 16h cmp ah, 1 ;ждем конкретно Esc, чтобы можно было легче вводить 0 и 1 jne WaitKey
mov ax, 4c00h int 21h ;выход в ДОС
Get Pulse proc ;Вводим строку из 0 и 1 lea dx, sIn mov ah, 9 int 21h ;приглашение
lea di, Q ;адрес, куда запишем mov cx, N ;количество GPLoop: mov ah, 8 int 21h ;ждем код cmp al, '0' ;ждем только 0 je GPSet cmp al, '1' ;и 1 jne GPLoop ;стальные игнорируем GPSet: stosb ;сохраняем mov dl, al mov ah, 2 int 21h ;и выводим на экран loop GPLoop ret GetPulse endp
ModifyPulse proc ;модифицируем lea si, Q ;исходная строка 0 и 1 lea di, P ;результат mov cx, N ;длина строки mov bx, 00ffh ;bl - min Cj, сначала самое большое число 255 ;bh - текущая сумма нулей Cj xor dx, dx ;dl - sum Sj, сумма всех единиц MPLoop: lodsb ;очередной код cmp al, '0' je MPCalcC ;встретился 0 ;встретилась 1 cmp bh, 0 ;были ли перед этим 0 je MPCalcS ;не было, идем на подсчет 1 ;были, найдем минимальную длину последоват ельности cmp bh, bl ;сравним с min jae MPClsBh mov bl, bh ;номый min MPClsBh: mov bh, 0 ;сбросим длину текущей последовательности 0
MPCalcS: inc dl ;считаем 1 jmp MPNext MPCalcC: ;встретился 0 inc bh ;считаем 0 MPNext: loop MPLoop ;по всем
cmp bh, 0 ;проверим на последнюю последнюю последовательность 0 je MPFormP ;не было - обходим cmp bh, bl ;сравним с минимумом jae MPFormP mov bl, bh
MPFormP: ;формируем импульс Р mov cl, N ;длина строки cmp bl, 0ffh ;проверим, были ли вообще 0 je MPForm1 ;если не было, то пропишем всю строку 1 mov al, '0' ;если были, то сначала пропишем всю строку нулями rep stosb
lea di, P ;начало строки mov cl, dl ;число 1 mov bh, 0 ;сделаем слово add di, bx ;сдвинем на число первых 0 MPForm1: mov al, '1' ;пропишем 1 rep stosb ret ModifyPulse endp
PutPulse proc ;вывод строки на экран lea dx, sOut mov ah, 9 int 21h ;сообщение
lea si, P ;адрес строки mov cx, N ;длина строки mov ah, 2 ;функция вывода символа PPLoop: mov dl, [si] ;очередной символ inc si int 21h ;выводим loop PPLoop ;по всем ret PutPulse endp
.data sIn db "Enter Q (32 {0,1}): $" sOut db 0dh,0ah,'Pulse P: $' sPress db 0dh,0ah,'Press ESC for exit$'
.data? Q db N dup (?) ;исходный массив P db N dup (?) ;результирующий массив
end start ;точка входа
----- Люби своего ближнего, как самого себя Ответ отправил: Лысков Игорь Витальевич (Старший модератор) Ответ отправлен: 27.12.2010, 14:43 Номер ответа: 265132 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru
Оценка ответа: 5 Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"? | Отправить SMS #thank 265132 на номер 1151 (Россия) | Еще номера » | Вопрос № 181634: Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос:
Серию импульсов Q[1..32] (Qi={0,1}) преобразовать в один импульс P[1..32] с параметрами:
 машина .286, импульс создать в виде строки из 32 нолей и единичек.
заранее, спасибо) Отправлен: 27.12.2010, 06:04 Вопрос задал: Посетитель - 355629 (Посетитель) Всего ответов: 1 Страница вопроса » Отвечает Лысков Игорь Витальевич (Старший модератор) : Здравствуйте, Посетитель - 355629! Программка готова! С вопросами в мини-форум...
Код: N equ 32 ;размер массива
.model small .code start: ;точка входа mov ax, @data ;загрузим сегментные регистры сегментом данных mov ds, ax mov es, ax
call GetPulse ;Вводим ровно 32 нулей и единиц
call ModifyPulse ;модифицируем
call PutPulse ;выводим Exit: lea dx, sPress ;выведем приглашение нажать на Escape mov ah, 9 int 21h
WaitKey: mov ah, 0 ;ждем int 16h cmp ah, 1 ;ждем к онкретно Esc, чтобы можно было легче вводить 0 и 1 jne WaitKey
mov ax, 4c00h int 21h ;выход в ДОС
GetPulse proc ;Вводим строку из 0 и 1 lea dx, sIn mov ah, 9 int 21h ;приглашение
lea di, Q ;адрес, куда запишем mov cx, N ;количество GPLoop: mov ah, 8 int 21h ;ждем код cmp al, '0' ;ждем только 0 je GPSet cmp al, '1' ;и 1 jne GPLoop ;стальные игнорируем GPSet: stosb ;сохраняем mov dl, al mov ah, 2 int 21h ;и выводим на экран loop GPLoop ret GetPulse endp
;Считаем минимум и максимум нулей ;bl - min Cj, сначала самое большое число 255 ;bh - max Cj, сначала самое маленькое число 0 ;cl - текущая сумма 0 ;al - текущий байт CalcMinMax0 proc cmp cl, 0 ;были ли перед этим 0 je CMM0Ret ;не было - выход ;были, найдем минимальную длину последовательности cmp cl, bl ;сравним с min jae CMM0Max mov bl, cl ;н овый min CMM0Max: cmp cl, bh ;сравним с max jbe CMM0Clear mov bh, cl ;новый min CMM0Clear: mov cl, 0 ;сбросим длину текущей последовательности 0 CMM0Ret: ret CalcMinMax0 endp
;Считаем минимум и максимум единиц ;dl - min Sj, сначала самое большое число 255 ;dh - max Sj, сначала самое маленькое число 0 ;ch - текущая сумма 1 ;al - текущий байт CalcMinMax1 proc cmp ch, 0 ;были ли перед этим 1 je CMM1Ret ;не было - выход ;были, найдем минимальную длину последовательности cmp ch, dl ;сравним с min jae CMM1Max mov dl, ch ;новый min CMM1Max: cmp ch, dh ;сравним с max jbe CMM1Clear mov dh, ch ;новый min CMM1Clear: mov ch, 0 ;сбросим длину текущей последовательности 1 CMM1Ret: ret CalcMinMax1 endp
ModifyPulse proc ;модифицируем lea si, Q ;исходная строка 0 и 1 mov di, N ;длина строки mov bx, 00ffh ;bl - min Cj, сначала самое большое число 255 ;bh - max Cj, сначала самое маленькое число 0 mov dx, 00ffh ;dl - min Sj, сначала самое большое число 255 ;dh - max Sj, сначала самое маленькое число 0 xor cx, cx ;cl - текущая сумма 0 ;ch - текущая сумма 1 MPLoop: lodsb ;очередной код cmp al, '0' je MPCalc0 ;встретился 0 ;встретилась 1 call CalcMinMax0 ;считаем минимум и максимум нулей inc ch ;считаем 1 jmp MPNext MPCalc0: call CalcMinMax1 ;считаем минимум и максимум единиц inc cl ;считаем 0 MPNext: dec di jnz MPLoop ;по всем
call CalcMinMax0 ;учтем последнюю последовательность call CalcMinMax1
MPFormP: ;формируем импульс Р lea di, P ;результат mov cx, N ;длина строки mov al, '0' ;сначала пропишем всю строку нулями rep stosb
lea di, P ;начало строки mov cl, bh ;max Cj shr cl, 1 ;max Cj/2 add cl, dh ;max Sj + max Cj/2 add di, cx ;сдвинем на число пер вых 0 ;посчитаем, сколько осталось до конца разрядов mov si, 32 sub si, cx
;подправим min Cj, если не было 0 test bl , bl ;для 0ffh сделаем 0 jns MPTestMin1 inc bl ;сделаем 0 MPTestMin1: ;подправим min Sj, если не было 1 test dl, dl ;для 0ffh сделаем 0 jns MPCalcCount1 inc dl ;сделаем 0 MPCalcCount1: ;посчитаем длину 1 mov cl, bl ;min Cj shr cl, 1 ;min Cj/2 add cl, dl ;min Sj + min Cj/2 ;проверим с числом оставшихся разрядов cmp cx, si jbe MPWrite1 ;пишем mov cx, si ;если больше, то ограничим до конца строки MPWrite1: mov al, '1' ;пропишем 1 rep stosb ret ModifyPulse endp
PutPulse proc ;вывод строки на экран lea dx, sOut mov ah, 9 int 21h ;сообщение
lea si, P ;адрес строки mov cx, N ;длина строки mov ah, 2 ;функция вывода символа PPLoop: mov dl, [si] ;очередной символ inc si int 21h ;выводим loop PPLoop ;по всем ret PutPulse endp
.data sIn db "Enter Q (32 {0,1}): $" sOut db 0dh,0ah,'Pulse P: $' sPr ess db 0dh,0ah,'Press ESC for exit$'
.data? Q db N dup (?) ;исходный массив P db N dup (?) ;результирующий массив
end start ;точка входа
----- Люби своего ближнего, как самого себя Ответ отправил: Лысков Игорь Витальевич (Старший модератор) Ответ отправлен: 27.12.2010, 16:14 Номер ответа: 265134 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru
Оценка ответа: 5 Комментарий к оценке: спасибо) Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"? | Отправить SMS #thank 265134 на номер 1151 (Россия) | Еще номера » | Оценить выпуск » Нам очень важно Ваше мнение об этом выпуске рассылки! Скажите "спасибо" эксперту, который помог Вам! Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА на короткий номер 1151 (Россия) Номер ответа и конкретный текст СМС указан внизу каждого ответа. Полный список номеров » * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов) ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются. *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании. |
Комментариев нет:
Отправить комментарий