Паскаль в Ассемблер

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 31
Зарегистрирован: Пн сен 24, 2012 01:47:35
Откуда: Томск

Сообщение Andrew-77 »

Alexeyslav писал(а):
А в общем, не так все плохо... на ассемблере надо реализовать сам алгоритм - чтобы не парится с вводом-выводом, этот алгоритм можно вставить в паскалевскую оболочку как процедуру сделанную полностью INLINE на ассемблере.
Как раз это и нужно сделать, не всю прогу а только функцию разделения на множители и нахождение наибольшего общего делителя. То что я красным выделил. Вывод массивов для наглядности в асме можно выкинуть
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4742
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

Andrew-77 писал(а):Балаболов много, а дела мало. Это не курсовая, всего лишь половина небольшой контрольной, я просто по времени не успеваю разобраться в этом полность, потому и прошу помощи.
Не помощи ты просишь, а чтобы за тебя сделали. Это разные вещи. Вдруг прокатит. А тут желающих делать за кого-то контрольные, курсовые или дипломы не много.
Реклама
Друг Кота
Сообщения: 5339
Зарегистрирован: Вт фев 21, 2012 13:51:55
Откуда: Начинающий

Сообщение petrenko »

Да не "в лом", можно и помочь, не жалко, просто настроение что то неважное.. :(
Я тут "выкопал" с дальней полки учебник "ФОРТ", но там этой программы нема.. Значит в другом учебнике - точно помню, что на форте был пример. Зато в этом оказался учебный пример программы - "генератор бессмысленных сообщений" :) "Прикольно"- выдаёт нечто вроде : "В ДАННОМ СООБЩЕНИИ МЫ РАССКАЖЕМ ВАМ О ТОМ ЧТО ВКЛАДЫВАЯ ИМЕЮЩИЕСЯ В НАЛИЧИИ СРЕДСТВА В ИНТЕГРИРОВАННЫЙ ЦИФРОВОЙ КОМПЛЕКС ПРИМЕНЯЯ АВТОНОМНЫЙ КУЛЬТУРНЫЙ ПРОДУКТ ПРЕДСТАВЛЯЕТСЯ ВОЗМОЖНЫМ ДАЖЕ НЕСМОТРЯ НА КВАЛИФИЦИРОВАННЫЙ ЦИФРОВОЙ ПРОЕКТ ЕЩЁ БОЛЬШЕ УКРЕПИТЬ УНИКАЛЬНЫЙ ПРОГРАММНЫЙ ОБЪЁМ". ну и т.д.
Ещё пошукаю. Если найду - выложу.
Ещё можно в WWW попробовать запрос "оптимальный алгоритм нахождения н.о.д." Пока нашлось вот это :
Спойлер
Методы нахождения НОД и НОК чисел
/фио/
/фио/
МОУ СОШ № x
6б класс
Руководитель
/фио/

В школьном курсе математики нахождение наибольшего общего делителя (НОД), наименьшего общего кратного (НОК), наименьшего общего знаменателя и дополнительных множителей для дробей предлагается через разложение чисел на простые множители. Это связано с большим количеством однообразных механических вычислений.
Быстрое нахождение НОД и НОК чисел необходимо в дальнейшем для нахождения наименьшего общего знаменателя и дополнительных множителей для дробей при сравнении, сложении и вычитании дробей с разными знаменателями.
Цель работы: рассмотреть и оценить все методы нахождения НОД, НОК чисел. С учетом их эффективности, простоты в использовании разработать алгоритм нахождения НОД и НОК для двух и более чисел. Он позволит сделать оптимальный выбор метода.
Зачастую элементарный анализ исходных чисел может привести к быстрому нахождению НОД, НОК этих чисел без разложения на простые множители. С этой целью в работе рассмотрены частные случаи нахождения НОД и НОК чисел, когда исходные числа взаимно простые или когда одно из них кратно другому.
Попытка заменить разложение чисел на простые множители менее затратной процедурой привела к созданию метода одновременного деления. Разложение на множители в этом методе также необходимо, только множители не обязательно должны быть простыми, но обязательно общими. В этом случае количество действий значительно уменьшается, тем самым упрощается нахождение НОД и НОК чисел.
Каждый из предложенных в работе методов имеет свои ограничения, поэтому невозможно обойтись каким-то одним.
Рассмотренные в работе методы нахождения НОД и НОК чисел как частные (для взаимно простых чисел или кратных чисел), так и метод одновременного деления требуют меньшего количества вычислений и просты в применении. Они могут быть использованы в первую очередь для нахождения НОД и НОК двух и более чисел. Они удобны и для нахождения дополнительных множителей при приведении дробей к общему знаменателю. Основным результатом работы можно считать создание алгоритма для оптимально быстрого нахождения НОД и НОК чисел.

Алгоритм нахождения НОД и НОК чисел.
1 шаг. Если числа а, b взаимно простые, то
НОД(а, b) = 1, НОК(а, b) = а?b
2 шаг. Если число а кратно b, то
НОД(а, b) = b, НОК(а, b) = а
3 шаг. Использовать метод одновременного деления.
Одновременное разложение чисел на одинаковые множители до получения взаимно простых чисел.
Для нахождения НОД нужно найти произведение одинаковых множителей.
Для нахождения НОК нужно одно из исходных чисел умножить на оставшееся число в разложении другого числа.
4 шаг. Использовать разложение на простые множители для нахождения НОК для количества чисел более двух.
Не ассемблер, конечно, зато для 6 класса даже подходит.. :)

Попробовал ещё, и не ya.ru , а google и запрос на аглицком..
На запрос "greatest common divisor algorythm"- уже лучше - выдаёт меньше всякой шелухи и даже несколько текстов на "C".
Вот из википедии - пожалуйста :
Iterative version in C++ using ctz (count trailing zeros)
Using a count trailing zeros (CTZ) function can improve the performance of the binary gcd algorithm. A randomly distributed number has an exponentially declining distribution of trailing zeros: 0.50 have no trailing zeros, 0.25 have 1 trailing zeros, 0.125 have 2 trailing zeros, 0.0625 have 3 trailing zeros, .... Iterations are only saved if there are two or more trailing zeros, so the expected number of saved iterations is not large. Although there are occasions where counting trailing zeros can gain a lot in one step, big gains would not be expected unless the numbers had unusual properties.
// ctz(x) counts trailing zeros in x

unsigned int gcd(unsigned int x, unsigned int y)
{
if (x == 0)
return y;

if (y == 0)
return x;

unsigned int cf2 = ctz(x | y);

x >>= ctz(x);

for (;;)
{
y >>= ctz(y);

if (x == y)
break;

if (x > y)
std::swap(x, y);

if (x == 1)
break;

y -= x;
}

return x << cf2;
}
А что сам T.S. ничего не нашёл ещё разве ?
< виртуальная "кнопочка" >--( WWW ) <- Убедительная просьба интересующимся старыми компьютерами типа РК86 - не пишите в теме в барахолке, пишите Ваши вопросы в ( лс ) пожалуйста
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 31
Зарегистрирован: Пн сен 24, 2012 01:47:35
Откуда: Томск

Сообщение Andrew-77 »

Спасибо тем кто не ослеп в собственном величии и важности то есть хоть чем то попытался помочь. Кое что помогло разобраться с массивами в ассемблере (petrenko). В общем разобрался сам, все сделал, хоть и после сессии, буду просить о дополнительном времени чтобы сдать экзамен.
Для petrenko: алгоритм Евклида это самое простое для нахождения НОД, но в задаче сказано разложить два числа на множители, а уже из ник сделать НОД, то есть перемножить однократно совпадающие. Загвоздка была в выборке из массивов именно однократно повторяющихся. Но успешно решено. Респект
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 5339
Зарегистрирован: Вт фев 21, 2012 13:51:55
Откуда: Начинающий

Сообщение petrenko »

Здорово !

За Вас можно порадоваться, так держать.

Только Паскаль ( он - не забывайте - только для обучения ! ) для серьёзного программирования не подходит.
Чтобы переходить "плавно", без "переламывания" советую перейти на язык "Модула-2" того же товарища Вирта - тоже учебный, но убраны многие "неправильности" Паскаля.
Для развития мышления и создания близких к маш.коду-ассемблеру по эффективности и компактности программ хорошо изучить язык Форт .
А для перспективы взгляните на Эрланг ..

Удачи !
< виртуальная "кнопочка" >--( WWW ) <- Убедительная просьба интересующимся старыми компьютерами типа РК86 - не пишите в теме в барахолке, пишите Ваши вопросы в ( лс ) пожалуйста
Контактная информация:
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 31
Зарегистрирован: Пн сен 24, 2012 01:47:35
Откуда: Томск

Сообщение Andrew-77 »

я пишу на С(и верхний(иногда делфи), и нижний), паскаль давнее прошлое, только из-за задания, а ассеблер так редко использовал, что практически каждую работу которую нужно было сделать, как с нуля(учебники, справочники). по сути какая разница какой язык, база все равно алгоритм, но вот синтаксис у каждого свой и помнить все языки не реально
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3761
Зарегистрирован: Чт янв 26, 2012 14:44:34

Сообщение El-Eng »

petrenko писал(а):Только Паскаль ... для серьёзного программирования не подходит.
Ну да. А, например, Skype и Altium Designer конечно же не в счет. :)
Like the eyes of a cat in the black and blue...
Первый раз сказал Мяу!
Сообщения: 30
Зарегистрирован: Пт июл 27, 2012 22:51:52

Сообщение ldir »

El-Eng писал(а):Skype
Он вроде как на плюсах написан
Друг Кота
Аватара пользователя
Сообщения: 3761
Зарегистрирован: Чт янв 26, 2012 14:44:34

Сообщение El-Eng »

Нет, на Delphi.
Like the eyes of a cat in the black and blue...
Первый раз сказал Мяу!
Сообщения: 30
Зарегистрирован: Пт июл 27, 2012 22:51:52

Сообщение ldir »

Уточнение: Linux версия скайпа написана на с++ в Qt
Встал на лапы
Аватара пользователя
Сообщения: 94
Зарегистрирован: Чт май 26, 2011 09:28:25
Откуда: Алма-Ата

Сообщение UL7AAjr »

Эх, хорошую тему прозевал:)

Можно было очень просто сделать, пишем на Делфи а потом Ctrl-F7 и видим код на ассемблере.

PS: из-за конвейеров и выравнивания в новых процессорах, практически очень трудно написать на ассемблере код быстрее чем оптимизатор это сделает из С или Паскаля. Если внимательно посмотреть на код после оптимизатора, можно заметить добавленные NOP для выравнивания и "перепутанные" местами операторы для возможности одновременного выполнения. Ассемблер так не делает.
[size=70]Жадность порождает бедность[/size]
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

То что ты увидишь в дизассемблере это будет жуткого вида исполнимый код, который без огромного количества дополнительных библиотек попросту НИЧЕГО не стоит. Толку-то от этого кода, если его надо обрабатывать потом напильником до полной неузнаваемости? Проще с нуля написать...
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 606
Зарегистрирован: Вт июн 25, 2013 18:45:07

Сообщение Andrew Martin »

И всё же ассемблер остаётся единственным языком, где всё действительно только в ваших руках :)
Непопулярность его для написания хороших native code приложений объясняется во многом коммерцией, а во многом попросту политикой Microsoft и ей подобных глобалистов. Ведь хорошо знающий асм - это не только хороший программист, это потенциальный крякер. Поэтому никому не выгодна пропаганда ассемблера в частности и компиляторов native code в целом, за то всем выгодно пересаживать на дотнет и прочие фреймворки, чтобы сторонние особо не совали нос в системные дела. Да извинят меня за пошлость, но со стороны это выглядит как надевание ещё одного презерватива поверх имеющихся :)))
Ответить

Вернуться в «Интеграция с ПК»