Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Bad_Digger
1 / 1 / 0
Регистрация: 30.11.2014
Сообщений: 20
1

Вводить целые числа пока не встретится 0. Определить количество четных введенных чисел

19.11.2015, 00:57. Просмотров 483. Ответов 9
Метки нет (Все метки)

Всем привет!
Продолжаю разбираться с изучением Ассемблера. Поставлена задача: "Вводить целые числа пока не встретится 0. Определить количество четных введенных чисел.".
Поскольку заниматься этим времени особо нет (а знать все-таки хочется), то возникает трудность с реализацией программы.
Как реализовать сам цикл? Как сравнить с нулем я понимаю. Как выводить числа - понимаю. А как прописать именно вычисление количества четных введенных чисел? Помогите, пожалуйста, если вам не тяжело.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2015, 00:57
Ответы с готовыми решениями:

Вводить целые числа пока не встретится 0. Определить максимальное введенное число
Всем привет! Пытаюсь разобраться в изучении Ассемблера. Поставлена задача: "Вводить целые числа...

Вводить целые числа пока не встретится 0. Определить минимальное введенное число
Всем привет! Имею задачу: Вводить целые числа пока не встретится 0. Определить максимальное...

Вводить числа с клавиатуры, пока не встретится 0. Подсчитать сумму всех * введенных нечетных чисел
Помогите,пожалуйста! По информатике задали...Язык паскаль Вводить числа с клавиатуры, пока не...

Вводить числа, пока не встретится 0. Найти минимальное из введенных цифр
Вводить числа, пока не встретится 0. Найти минимальное из введенных цифр.

Вводить числа, пока не встретится 0. Найти их сумму и количество
Вводить числа, пока не встретится 0. Найти их сумму и количество.

9
Mikl___
Автор FAQ
13388 / 6388 / 631
Регистрация: 11.11.2010
Сообщений: 11,556
19.11.2015, 04:15 2
Bad_Digger,
FAQ для раздела Assembler, MASM, TASM
http://www.cyberforum.ru/assembler-articles/thread1005284.html
1
Constantin Cat
2993 / 1127 / 376
Регистрация: 28.02.2015
Сообщений: 2,481
Завершенные тесты: 1
19.11.2015, 11:56 3
Цитата Сообщение от Bad_Digger Посмотреть сообщение
Как реализовать сам цикл? Как сравнить с нулем я понимаю.
Раз понимаете сравнение с нулем, то после сравнения, если не ноль переход на начало ввода числа.

Цитата Сообщение от Bad_Digger Посмотреть сообщение
А как прописать именно вычисление количества четных введенных чисел
У четных чисел, младший бит всегда ноль, если не ноль - игнорируете инкремент счетчика.
0
Bad_Digger
1 / 1 / 0
Регистрация: 30.11.2014
Сообщений: 20
19.11.2015, 12:56  [ТС] 4
Спасибо за советы. Mikl___, ты в одном из топиков хорошо написал обработку данного цикла. Зато мне указал на учебники. Отличный ход, правда. Хотя, хотелось посмотреть именно код. Ну да ладно. Вот, что у меня получилось. И оно работает.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
info db "Вычисление количества четных числе из множества введенных чисел. $"
smsa db "Вводите числа. Для окончания ввода введите 0 (ноль): $"
smsb db "Количество четных чисел среди введенных = $" 
N dw ?
kol dw 0
.code ; начало сегмента кода 
start: ; метка start - начало программы 
mov ax, @data ; в ax записываем начальный адрес сегмента данных 
mov ds,ax ; AX копируем в DS 
mov cx,kol
lea dx,info
outstr ;вывод info 
newline ;переход на новую строку 
lea dx,smsa 
outstr ;вывод smsa 
newline
cikl: ;метка на начало цикла
inint N ;ввод N
mov ax,N
mov bl,2
idiv bl   ;делим N на 2
cmp ah,0  ;сравниваем остаток от деления с нулем
jne N_ne_ravno_0  ;если N не равно 0, то перескакиваем на метку 
                ; N_ne_ravno_0 иначе выполняем следующую команду
add cx,1
cmp ax,cx ;сравниваем значения регистров AX и CX       
N_ne_ravno_0:
cmp ax,0 ;сравниваем значение AX и 0
jne cikl ;если N не равно 0, то перескакиваем на метку cikl
         ;иначе выполняем следующую команду
sub cx,1
lea dx,smsb
outstr ;вывод smsb
mov kol,cx ;значение CX записываем в kol
outword kol ;вывод строки с максимальным числом
finish ; макрокоманда завершения программы. 
end start ; конец программы с точкой входа start
1
Constantin Cat
2993 / 1127 / 376
Регистрация: 28.02.2015
Сообщений: 2,481
Завершенные тесты: 1
19.11.2015, 14:54 5
Цитата Сообщение от Bad_Digger Посмотреть сообщение
Отличный ход, правда.
Цель форума - оказать помощь в изучении, нам - не нужно, мы уже знаем.

Вот теперь можно и совершенствовать код. Участок кода:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
mov ax,N
mov bl,2
idiv bl   ;делим N на 2
cmp ah,0  ;сравниваем остаток от деления с нулем
jne N_ne_ravno_0  ;если N не равно 0, то перескакиваем на метку 
                ; N_ne_ravno_0 иначе выполняем следующую команду
add cx,1
cmp ax,cx ;сравниваем значения регистров AX и CX       
N_ne_ravno_0:
cmp ax,0 ;сравниваем значение AX и 0
jne cikl ;если N не равно 0, то перескакиваем на метку cikl
         ;иначе выполняем следующую команду
sub cx,1
проще переписать так:
Assembler
1
2
3
4
5
6
7
8
9
mov ax,N
or  ax,ax;проверяем ноль
jz  isStop;ноль выходим из цикла
    ;следующая команда заменяет деление на 2
shr ax,1;получаем младший бит(флаг CF), у четного он равен нулю
cmc ;инвертируем младший бит(флаг CF), полученный ранее
adc cx,0;суммируем с учетом флага CF
jmp cikl;продолжаем ввод чисел
isStop:;выход из цикла
1
Bad_Digger
1 / 1 / 0
Регистрация: 30.11.2014
Сообщений: 20
19.11.2015, 16:23  [ТС] 6
Constantin Cat, спасибо за интересный способ оптимизации. Сейчас попробую. Вот только это будет скорее для меня, чем для окружающих. Спасибо!
0
Constantin Cat
2993 / 1127 / 376
Регистрация: 28.02.2015
Сообщений: 2,481
Завершенные тесты: 1
19.11.2015, 16:44 7
Цитата Сообщение от Bad_Digger Посмотреть сообщение
Вот только это будет скорее для меня, чем для окружающих.
Почему, разве это для Вас новые команды?
0
Bad_Digger
1 / 1 / 0
Регистрация: 30.11.2014
Сообщений: 20
19.11.2015, 18:25  [ТС] 8
Constantin Cat, в большинстве своем, да. Да, посмотрев этот кусок измененного кода, я увидел, что одно и то же действие можно рассматривать различными действиями. И это здорово.
0
Constantin Cat
2993 / 1127 / 376
Регистрация: 28.02.2015
Сообщений: 2,481
Завершенные тесты: 1
20.11.2015, 01:03 9

1)Когда Вы изучали умножение/деление, Вам должны были расказывать об упрощенных аналогах операций со степенями двойки(сдвиговые операции как раз их заменяют, это есть в любом учебнике по асму), т.к. MUL | DIV слишком тяжоловесны в плане тактов процессора.
2)Сложение/Вычитание, Вам должны были дать начала длинной арифметики или двойной точности,
AX : BX = AX : BX+CX : DX :
Assembler
1
2
add bx,dx
adc ax,cx
3)Команда СМС, пожалуй это единственное, о чем Вам могли не говорить. Тут можно сослатся на самообразование при изучении команд работы с флагами.
0
Bad_Digger
1 / 1 / 0
Регистрация: 30.11.2014
Сообщений: 20
20.11.2015, 10:30  [ТС] 10
Constantin Cat, да, про СМС нам точно не рассказывали. Да и про аналогии со степенями двойки как-то упустили. Поэтому, для меня это такой шок, если можно сказать. Я понимаю, что mul и div нагружают процессор, особенно если применять цикл с большим числом повторений.
0
20.11.2015, 10:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2015, 10:30

Вводить числа, пока не встретится 7. Найти квадраты тех чисел, которые больше 10
Вводить числа, пока не встретится 7. Найти квадраты тех чисел, которые больше 10. задача на цикл...

Вводить произвольные числа до тех пор пока не будет введено число 555. Найти сумму и количество введенных чисел
Задание такое: Составить алгоритм и программу для задания 3. Вот собственно задание 3: Вводить...

Вводить произвольные числа до тех пор пока не будет введено число 555. Найти сумму и количество введенных чисел
Вообще у меня такая проблема, вот дано мне задание: "Вводить произвольные числа до тех пор пока не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru