Консультация № 182455
10.03.2011, 16:47
248.47 руб.
0 11 2
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:Можноли выполнить лабу?(Скупо начитали курс лекций поставили задачу выполнить:)

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


Обсуждение

Неизвестный
10.03.2011, 16:52
общий
Такую работу Вы уже выполняли(одногрупнику) но с другим условием, по этому уверен проблем не должно быть. Заранее благодарен 4eekee4@gmail.com
давно
Посетитель
7438
7205
10.03.2011, 16:55
общий
Да у нас проблем никогда не бывает. Сделаем
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
10.03.2011, 16:57
общий
Очень рад !:)
давно
Старший Модератор
31795
6196
10.03.2011, 17:44
общий
Цитата: 366118
Ввести пять целых чисел. Выяснить, является ли их сумма четным числом.


Размер в котором должно прятатся число?

Байт, слово или двойное слово.


Тут "мысля" крутится, что сами числа не важны, важны только их младшие цифры.

Вот четность этой суммы и нужно прооверять.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
10.03.2011, 19:43
общий
Адресаты:

Цитата: Зенченко Константин Николаевич
...важны только их младшие цифры.

Важен только один младший бит, от каждого числа!
давно
Посетитель
7438
7205
11.03.2011, 09:46
общий
Честно говоря, я не помню такого вопроса (заданного, как говорите, Вашим одногруппником).
Ну да Бог с ним. Сделаю, в течение дня, если кто другой не опередит.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
11.03.2011, 15:11
общий
это ответ
Здравствуйте, Посетитель - 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) Код программы:

[code h=200]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 ;конец программы с указаниием точки входа
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
11.03.2011, 17:36
общий
это ответ
Здравствуйте, Посетитель - 366118!

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

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

Приложение:
model tiny
.186
.code
org 100h
n equ 5
;готовимся к циклу
begin: mov cx,n;количество чисел
xor di,di;храниение суммы младших цифр
isLoopInp: call InpNumber;подпрограмма ввода
add di,dx;суммируем
loop isLoopInp;цикл
lea dx,dbEven;сообщение четно
shr di,1;заполняем флаг CF
jnc isEven;CF=0 переход
lea dx,dbOdd;сообщение нечетно
isEven: mov ah,9;функция вывода строки
int 21h;ДОС
xor ax,ax;функция чтение символа без эхо
int 16h;БИОС
ret;завершить работу
;сообщения программы
dbEven db 10,13,'Result is even$'
dbOdd db 10,13,'Result is odd$'
dbNumber db 10,13,'Enter Number:$'
;
;подпрограмма чтения числа
InpNumber: lea dx,dbNumber;сообщение введите число
mov ah,9;функция вывода строки
int 21h;ДОС
xor dx,dx;последнее введенная цифра
@@01: xor ax,ax;чтение символа без эхо
int 16h;БИОС
cmp al,13;клавиша ВВОД
jz @@02;переходим
cmp al,'0';символ 0
jb @@01;меньше переходим
cmp al,'9';символ 9
ja @@01;больше переходим
mov dl,al;запоминаем введенную цифру
int 29h;выводим её на экран
jmp short @@01;переходим к следующей
@@02: ret;возврат
end begin
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
11.03.2011, 19:07
общий
Уважаемые специалисты!-Я рпосто прибываю в восторге!-Оперативность и Ваша любовь к своему делу пробуждает во мне глубокое Уважение и признательность, а главное вижу точно дело не в деньгах. Приступаю к анализу данных!
давно
Старший Модератор
31795
6196
11.03.2011, 19:15
общий

Спасибо.
Надеюсь у Вас получится разобратся самостоятельно.
Возникнут вопросы по программам, обращайтесь.
Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
11.03.2011, 20:07
общий
Спасибо! Удачи!
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа