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

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


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

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

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

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

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

Номер выпуска:1426
Дата выхода:15.03.2011, 17:30
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:218 / 67
Вопросов / ответов:1 / 2

Вопрос № 182455: Уважаемые эксперты! Пожалуйста, ответьте на вопрос:Можноли выполнить лабу?(Скупо начитали курс лекций поставили задачу выполнить:) Требования к выполнению лабораторных работ Лабораторные работы выполняются в дисплейном классе по ин¬дивидуа...



Вопрос № 182455:

Уважаемые эксперты! Пожалуйста, ответьте на вопрос:Можноли выполнить лабу?(Скупо начитали курс лекций поставили задачу выполнить:)

Требования к выполнению лабораторных работ
Лабораторные работы выполняются в дисплейном классе по ин¬дивидуальным заданиям, полученным от преподавателя. Состав и сложность заданий может варьироваться в зависимости от уровня подготовки студента. По итогам выполнения каждой работы сту¬дентом оформляется отчет. Отчет о выполнении работы должен содержать:
 краткие теоретические сведения, необходимые для выполне¬ния работы;
 описание структур данных, обрабатываемых программой;
 описание алгоритма выполнения задания в виде псевдокода или блок схемы;
 описание вводимых данных и результатов работы про¬граммы;
 требования, к техническим и программным средствам, необхо¬димым для выполнения программы.
Тесты программ на ассемблере, разрабатываемые при выполнении ла¬бораторных работ, долж ны содержать достаточное количество коммента¬риев. Распечатывать текст программы в отчете необязательно.
Цель работы. Написать на языке ассемблера программу, реализующую некоторый алгоритм в соответствии с полученным заданием.
Ввести пять целых чисел. Выяснить, является ли их сумма четным числом.


Отправлен: 10.03.2011, 16:47
Вопрос задал: Посетитель - 366118 (Посетитель)
Всего ответов: 2
Страница вопроса »


Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Посетитель - 366118!
1) Теория: для выяснения, является ли число четным, достаточно знать младший бит младшей цифры числа (0 - четное, 1 - нечетное).
Кроме того, для выяснения, является ли сумма чисел четным числом, достаточно сложить младшие биты всех чисел по модулю 2, т.е. применить операцию XOR
Т.о., для ответа на вопрос, является ли сумма чисел четным числом, достаточно найти сумму по модулю 2 младших бит младших (последних) цифр всех чисел.
Полученное значение (0 или 1), умноженное на 2, используем, как индекс в таблице адресов строк, для вывода соответствующего сообщения.

2) В программе используется описанная ниже структура данных, необходимая для работы функции 0ah, для ввода строки символов.
sBuf db 80 ;максимальная длина строки 79+1 для кода 0dh
sLen db ? ;реальная длина введенной строки, заносится после отработки (не используем)
sNum db 80 dup (?) ;собственно строка

3) Общая блок-схема:



Блок-схема подпрограммы:



Блок-схема в виде DOC-документа

4) Программа ждет ровно пять чисел в любом виде: хоть в одной строке, хоть в нескольких.
Концом числа считаются любые символы-нецифры (например, пробел или конец строки), все нецифры перед числом игнорируются.
Перед числом допускается знак минус.
Т.к. программа использует только последнюю цифру, то ограничений на длину числа нет. Единственно, общая длина строки не должна превышать 79 знаков.
После ввода чисел, программа выводит сообщение о четности суммы в виде:
Sum is odd для нечетной суммы или Sum is even для четной
Примерный результат работы:



5) Программа написана универсально, будет работать на любом х86-м процессоре, компилируется и tasm-ом, и masm-ом

6) Код программы:

Код:
COUNT equ 5  ;число
ожидаемых чисел

cseg segment para public 'code' ;сегмент кода
assume cs:cseg, ds:dseg, es:dseg, ss:sseg ;свяжем сегментные регистры с указанными сегментами
start: mov ax, dseg ;загрузим сегментные регистры DS, ES
mov ds, ax ; адресом сегмента данных
mov es, ax

lea dx, sEnter ;приглашаем ввести числа
mov ah, 9
int 21h

xor di, di ;здесь будем накапливать сумму последнего бита вводимых чисел
mov cx, COUNT ;ч исло вводимых чисел
StrLoop: ;цикл по вводимым строкам
lea dx, sBuf ;адрес структуры для ввода строки
mov ah, 0ah ;вводим строку с 1-5 числами
int 21h

lea si, sNum ;адрес введенной строки
NumLoop: ;цикл по числам в строке
call GetLastDigit ;получаем младший бит младшей цифры числа
jc StrLoop ;если дошли до конца строки, то вводим следующую
xor di, ax ;складываем младший бит по модулю 2 !
loop NumLoop ;на следующее число в строке
;введены и обработаны 5 чисел !
;выводим сообщение о четности/нечетности суммы
lea dx, sSum
mov ah, 9 ;'Sum is'
int 21h

;di = 0 - сумма четная, di = 1 - нечетная
shl di, 1 ;умножим на 2, чтобы адресовать слова
mov dx, pType[di] ;получим адрес соответствующего сообщения из таблицы
int 21h ;закончим вывод (ah осталось равным 9)

lea dx, sPress
mov ah, 9 ;выведем 'Press any key'
int 21h

mov ah, 8
int 21h ;под ождем нажатие на клавишу, чтобы окно не закрылось сразу

mov ax, 4c00h
int 21h ;выход в ДОС

;подпрограмма получения в AX младшего бита последней цифры числа
;во флаге FC признак того, найдено ли число (C=0 - найдено, С=1 - не найдено)
;на входе: si - адрес числовой строки.
;числа разделяются любым нециферным кодом, в конце строки код 0dh
;перед числом допускается знак -
GetLastDigit proc
;сначала найдем начало числа
lodsb ;читаем очередной символ
cmp al, 0dh ;конец строки?
je Eol ;значит, ничего больше нет!
cmp al, '-' ;минус - начало числа
je NumFound
cmp al, '0'
jb GetLastDigit ;нецифры пропускаем
cmp al, '9'
ja GetLastDigit
NumFound: ;ищем последний символ числа
mov ah, al ;сохраним текущий (а может он последний?)
lodsb ;читаем следующий
cmp al, '0'
jb NumEnd ;<0 (нецифра) - конец числа
cmp al, '9'
jbe NumFound ;0<=al<=9 (цифра) - продолжаем искать конец числа
NumEnd: ;нашли конец числа
dec si ;уменьшим на 1 для последующего анализа, ч то важно для анализа кода 0dh
mov al, ah ;последний символ
cmp al, '-' ;проверим на единственный минус
je GetLastDigit ;тогда игнорируем и ищем в строке начало следующего числа
and ax, 1 ;оставляем только младший бит !
clc ;признак того, что число найдено
ret
Eol: ;конец строки
mov ah, 2
mov dl, 0ah ;перейдем на экране на следующую строку для ввода следующей числовой строки
int 21h ; или вывода результата (код 0dh уже выведен после отработки функции 0ah)
stc ;признак того, что дошли конца строки, чисел больше нет
ret
GetLastDigit endp

cseg ends

;сегмент стека
sseg segment para stack 'stack'
dw 100h dup (?)
sseg ends

;сегмент данных
dseg segment para public 'data'
sEnter db 'Enter 5 numbers: $' ;строка - приглашение для ввода чисел
sSum db 0ah,'Sum is $' ;начало строки - сообщения о результате
pType dw sEven, sOdd ;таблица адресов строк сообщений
sOdd db 'odd$' ;нечетная
sEven db 'even$' ;четная
sPress db 0dh,0ah,'Press any key$';ждем нажатия на клавишу
;структура для ввода строки
sBuf db 80 ;максимальная длина строки 79+1 для кода 0dh
sLen db ? ;реальная длина введенной строки (не используем)
sNum db 80 dup (?) ;собственно строка
dseg ends

end start ;конец программы с указаниием точки входа

-----
Люби своего ближнего, как самого себя

Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 11.03.2011, 15:11
Номер ответа: 266204
Украина, Кировоград
Тел.: +380957525051
ICQ # 234137952
Mail.ru-агент: igorlyskov@mail.ru

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 266204 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Отвечает Зенченко Константин Николаевич (Модератор) :
    Здравствуйте, Посетитель - 366118!

    Блок схема программы и подпрограммы:

    Более простой вариант Вашего задания. Программа вводит ровно 5-ть чисел, ограничений на длину чисел нет. Подпрограмма ввода InpNumber контролирует нажимаемые клавиши и реагирует только на цифровые и ВВОД. Код клавиши нажатой перед клавишей ВВОД, возвращается в основную программу и суммируется в регистре процессора. Полученная сумма с помощью команды сдвига делится на 2, при этом остаток от деления помещается в CF. Наличие 1 в этом флаге определяет четность/нечетность числа.
    Удачи!

    Приложение:

    -----
    Итерация от человека. Рекурсия — от Бога. — Л. Питер Дойч

    Ответ отправил: Зенченко Константин Николаевич (Модератор)
    Ответ отправлен: 11.03.2011, 17:36
    Номер ответа: 266208
    Украина, Киев
    Тел.: +38-097-238-60-03
    Адрес: Украина, Киев

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 266208 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


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

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

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

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

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

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

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



    В избранное