Народ, не знаю куда точнее свою тему объявить, короче проблема такая, нужно прогу на Паскале переписать в Ассемблере для ПК. Кто может реально помочь? На Паскале написал, а вот в ассемблере уже бьюсь недели 3 и никак.
Re: Паскаль в Ассемблер
Добавлено: Вс сен 15, 2013 14:43:22
SERJ
Программу из "exe" конвертируете в «com» что бы знать с какого адреса она начинается и была в одном сегменте. Загоняете её в «Debug». Лучше в чистом DOS http://ru.wikipedia.org/wiki/Debug Дальше выполняете команду «U» и получаете свою программу на ассемблере.
Andrew-77 писал(а): нужно прогу на Паскале переписать в Ассемблере для ПК
А зачем?
Re: Паскаль в Ассемблер
Добавлено: Вс сен 15, 2013 18:51:05
petrenko
Сразу так предполагаются два варианта : 1.) Преп. сказал так сделать. ( Тогда предложение "SERJ"- самое то, что надо.. ) 2.) Хочет повысить эффективность зачем то - например даже на core-quad-dieci 3Ггц каком-нибудь нечто обсчитывается более 20 часов - а ему хотелось бы, чтоб за час ~ два хотя бы. Ну может и ещё что другое оказаться причиной.. ( Ясновидение маленько до ДВ не дотягивает ( - далековато.. ), не получается разглядеть саму программу, а без текста вряд ли можно что то вразумительное посоветовать, увы.. )
Re: Паскаль в Ассемблер
Добавлено: Вс сен 15, 2013 19:28:21
vem566
petrenko писал(а):обсчитывается более 20 часов - а ему хотелось бы, чтоб за час ~ два хотя бы.
На 80% быстродействие зависит от алгоритма, остальное - язык, процессор и т. п.
Re: Паскаль в Ассемблер
Добавлено: Вс сен 15, 2013 19:57:35
petrenko
"Смайлик" я не просто так туда "приаттачил", между прочим..
Прежде чем просить помочь перевести с одного на другое надо бы T.S. это самое "одно" то выложить наверное.. А то ( по аналогии ) вроде " переведите с английского на суахили, пожалуйста, но что именно перевести, я Вам не скажу". Очередная проверка форумчан на ясновидение ?
Re: Паскаль в Ассемблер
Добавлено: Пн сен 16, 2013 04:50:57
Andrew-77
Вообще нужно вставить кусок на ассемблере, и проверить время выполнения на ассемблере и на паскале, Ввести 2 числа разложить на множители, и найти наибольший делитель, вот листинг. Основную часть нужно дополнить ассемблером
Program NOD; uses CRT; var a,b,r,s,e:word; i,k,n:integer; c:array [1..10] of word; d:array [1..10] of word; begin clrscr; write('введите число a:'); readln(a); write('введите число b:'); readln(b); k:=0; n:=0; e:=1; s:=1; r:=a; i:=2; while i<=r do if r mod i = 0 then begin k:=k+1; c[k]:=i; r:=r div i; end else i:=i+1; r:=b; i:=2; while i<=r do if r mod i = 0 then begin n:=n+1; d[n]:=i; r:=r div i; end else i:=i+1; for i:=1 to 10 do begin if (c[i]=0) then c[i]:=1; if (d[i]=0) then d[i]:=1; end; writeln; for i:=1 to 10 do write(c[i],' '); writeln; for i:=1 to 10 do write(d[i],' '); for i:=1 to 10 do begin for k:=1 to 10 do if (c[i]=d[k]) and (c[i]<>d[k+1]) and (d[k]<>d[k+1]) then s:=s*c[i] ; end; for i:=1 to 10 do begin for k:=1 to 10 do if (d[i]=c[k]) and (d[i]<>c[k+1]) and (c[k]<>c[k+1]) then e:=e*d[i] ; end; writeln; if s<=e then write('Наибольший общий делитель ',s,' ') else write('Наибольший общий делитель ',e,' ') ; readKey; end.
Re: Паскаль в Ассемблер
Добавлено: Пн сен 16, 2013 15:36:54
petrenko
А ведь верно коллега сказал, что :
vem566 писал(а):На 80% быстродействие зависит от алгоритма, остальное - язык, процессор и т. п.
Но я и не предполагал, что бывает прямо вот так...
И позвольте полюбопытствовать, а таблица простых чисел у Вас где хранится ? Ну откуда Вы берёте очередное простое число ? ( Отвечать именно мне необязательно - это вопросы в первую очередь важны для Вашего более внимательного взгляда на Вашу программу - а для меня он по сути риторический, уж извините. ) И ещё - Вы блок-схему до написания рисовали ? Или раз преп. от Вас этого не требует, значит и не надо ? Скажите, пожалуйста, как Вы понимаете само разложение числа на множители ?
Re: Паскаль в Ассемблер
Добавлено: Пн сен 16, 2013 15:44:58
Andrew-77
Я понимаю потрепаться охота, но у меня край. Программа рабочая 100 %, все вопросы в код там все видно из условия. Нужно перегнать выделенный кусок в ассемблер, все вопросы после, если останеться желание. Если дело в деньгах, пишите договоримся
Re: Паскаль в Ассемблер
Добавлено: Пн сен 16, 2013 16:04:22
petrenko
Ладно, это я ворчу, придираюсь, есть такое. Программа, скажем так, не очень оптимальная.. Ассемблер ускорит её в 1.5 ~ 2 раза в лучшем случае. ( А преп. не требует доказать правильность работы алгоритма ? Тогда Вам повезло ещё. )
Но шут бы с этой эффективностью, понятно, что зачёт надо сдавать.
Ассемблер какого процесора требуется применить ? ( Я не всех процессоров коды знаю, увы, их просто много разных. )
Re: Паскаль в Ассемблер
Добавлено: Пн сен 16, 2013 16:13:08
Andrew-77
Да в общем то 8086,...80486 из этой серии, вся идея задания и состоит в оптимизации по скорости с помощью ассемблера, я бы хоть и на Си написал, ну что под рукой было на том и сделал, а вот ассемблер для 8086... ну жопа. Для атмелей или пиков еще както, здесь аут
Re: Паскаль в Ассемблер
Добавлено: Пн сен 16, 2013 17:16:53
petrenko
Andrew-77 писал(а):..8086 , 80486 ...
x86 мне знаком, один цикл "for" Вам изображу сейчас, попробую , но мучаться со всем куском - не знаю, как настроение - пока тут дождь и не особо весело..
Andrew-77 писал(а):... вся идея задания и состоит в оптимизации по скорости с помощью ассемблера...
Но если идея задания такова, то агент "007" не справился с агентами "0.5" и "0.7" и задание провалено. "Юстас - Алексу : Срочно пришлите в студию блок-схему ! Эксперты переделают для подбрасывания Рунге правдоподобную дезинформацию. "
Re: Паскаль в Ассемблер
Добавлено: Пн сен 16, 2013 19:09:04
ChipKiller
Andrew-77 писал(а): а вот ассемблер для 8086...
.. ассемблер не сложнее, чем любой другой, правда при программировании под DOS иногда нужно помнить о сегментах ... (486 значительно "жирнее" своего предшественника в плане возможностей ...)
ЗЫ. для студентов рекомендую почитать В. Н. Пильщиков Программирование на языке ассемблера IBM PC
Re: Паскаль в Ассемблер
Добавлено: Пн сен 16, 2013 19:25:04
vem566
SERJ предлагал дизассемблирование с последующей сборкой. В результате будет точно такой же по скорости работы файл. Фактически отладчик не переписывает программу на ассемблер, а декодирует коды, который сваял компилятор при сборке исходного файла. Ничего оптимизировать он не будет. petrenko все правильно говорит. И про таблицу простых чисел, и про, мягко говоря, не оптимальный алгоритм и про блок схему. Сама задача скорее из области академического интереса. Для понимания некоторых вещей весьма полезная. Но выходов, как часто бывает, два. Или все таки понять, где и как её можно разогнать, или диплом будет только подразумевать образование.
Re: Паскаль в Ассемблер
Добавлено: Пн сен 16, 2013 23:25:43
petrenko
Цикл : for i:=1 to 10 do begin if (c[i]=0) then c[i]:=1; if (d[i]=0) then d[i]:=1; end; самый простенький тут, пока хватило энтузиазьма и настроения только на него.. ( и то, только после ужина.. ) Его легко заменить на что то вроде : ( в регистре eflags или flags не забыть установить df:=0 ! )
max_i equ 10d ;размер массива == 10(десятичное) arr_c_beg equ** ;где (**) есть начальный адрес массива "c" из max_i==10decimal элементов the_1 equ 1d ; "чиста канкретная" единица (десятичная) the_0 equ 0d ; "чиста канкретный нуль" (десятичный, хотя нуль почти во всех системах счисления - нуль) mov di,arr_c_beg ;в индексный засылаем начальный адрес массива mov cx,max_i ;в счётчик засылаем размер массива mov bx,the_1 ;"чиста канкретную" единицу (десятичную) засылаем в bx for_1 mov ax,[di] ;цикл собственно cmp ax,the_0 ;проверяем элемент =="0" ? jne skip_1 ;если не равен "0", то пропускаем след.команду mov [di],the_1 ;а если равен, то заменяем "0" на "1" skip_1 inc di ;подвигаем указатель к следующему элементу loop for_1 ;если счётчик ещё не "it`s a final countdoun"*, то продолжим цикл..
Звиняйте, ежели где ошибся.. Пойду посмотрю, вроде в каком то учебнике было нечто похожее на Вашу несчастную задачку. Если вдруг окажется не на Трубо-Паскакале, а на Модула или на Форт - выкладывать ? *_С "it`s a final countdoun" можно ознакомиться там : Спойлер"офтоп" и потому под "спойлером"
P.S. А на Д.В. дождь тоже сейчас ?
Re: Паскаль в Ассемблер
Добавлено: Вт сен 17, 2013 07:59:09
vem566
Можно пойти и другим путем. Оптимизировать код паскаля, потом дизассемблер. Думаю, что раза в полтора можно увеличить скорость если просто оптимизировать код. Не алгоритм, а код. Давненько проводил эксперименты. Но помнится, что цикл for работает раза в три дольше, чем цикл while, а оператор типа a = a + 1 работает в десять(!) раз медленнее, чем Incr(a). Так что и в этом коде есть простор для творчества.
Re: Паскаль в Ассемблер
Добавлено: Вт сен 17, 2013 08:51:36
petrenko
По эффективности - Форт - один из пятёрки "самых" до сих пор. Ассемблер супротив Форт даёт всего 10% - не более обычно. И, да, оптимизировать надо алгоритм ещё на стадии блок-схемы, потому я и говорю, что "в студию, пожалуйста"..
Re: Паскаль в Ассемблер
Добавлено: Вт сен 17, 2013 12:08:31
vem566
Судя по всему получается, что блок-схемы нет. Мужику просто нужно сдать зачет, и он готов за это заплатить. Я не готов делать эту курсовую. На выходе из института что получим? Еще по одному диплому мне и petrenko? А
petrenko писал(а):после ужина..
я найду, чем заняться.
Re: Паскаль в Ассемблер
Добавлено: Вт сен 17, 2013 14:00:22
Andrew-77
Балаболов много, а дела мало. Это не курсовая, всего лишь половина небольшой контрольной, я просто по времени не успеваю разобраться в этом полность, потому и прошу помощи. Не нравиться код, оптимизируй, помоги, а еще лучше если такие крутые, перегоните в ассемблер, не дурак разберусь чтобы понять потом. Если бы не вопрос времени хрен бы я вообще спрашивал. От таких помощников ... это не комерческий проект, нахрен здесь не нужна ваша максимальная оптимизация, это просто легкий вариант сравнения одной и тойже программы на высоком и на низком, в каком угодно виде
Re: Паскаль в Ассемблер
Добавлено: Вт сен 17, 2013 14:13:34
Alexeyslav
вобщем да, хотел бы я посмотреть реализацию алгоритма деления на ассемблере...
А в общем, не так все плохо... на ассемблере надо реализовать сам алгоритм - чтобы не парится с вводом-выводом, этот алгоритм можно вставить в паскалевскую оболочку как процедуру сделанную полностью INLINE на ассемблере.
А если код особо проверять не будут, на ассемблере можно много чепухи похожей написать, а результат вывести заранее просчитанный алгоритмом на паскале... авось прокатит? Это с расчетом на то что сроки горят... но на самом деле, это надо было раньше делать.