Консультация № 181634
27.12.2010, 06:04
0.00 руб.
0 4 1
Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос:

Серию импульсов Q[1..32] (Qi={0,1}) преобразовать в один импульс P[1..32] с параметрами:

машина .286, импульс создать в виде строки из 32 нолей и единичек.

заранее, спасибо)

Обсуждение

давно
Посетитель
7438
7205
27.12.2010, 09:37
общий
А вот тут непонятно:
Что такое Si? Они вообще не упомянуты в условии.
Что такое max/min Si, max/min Ci, еще и деленное пополам.
Объясните.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
27.12.2010, 11:41
общий
maxSi-максимальное количество идущих вместе еденичек, maxCi-максимальное количество идущих вместе нолей, minSi - минимум единичек, minCi - минимум 0.
давно
Посетитель
7438
7205
27.12.2010, 12:04
общий
Вот теперь понятно... Ждите ответа (как соловей лета) Простите, не удержался
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
27.12.2010, 16:14
общий
это ответ
Здравствуйте, Посетитель - 355629!
Программка готова!
С вопросами в мини-форум...

[code h=200]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: $'
sPress db 0dh,0ah,'Press ESC for exit$'

.data?
Q db N dup (?) ;исходный массив
P db N dup (?) ;результирующий массив

end start ;точка входа
[/code]
5
спасибо)
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа