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

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


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

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

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

Boriss
Статус: Академик
Рейтинг: 2668
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2277
∙ повысить рейтинг »
vladisslav
Статус: 8-й класс
Рейтинг: 1318
∙ повысить рейтинг »

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

Номер выпуска: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 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Вопрос № 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 (Россия) | Еще номера »
  • Отправить WebMoney:


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

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

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

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

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

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

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


    © 2001-2010, Портал RFPRO.RU, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.25 от 13.12.2010

    В избранное