Страница 1 из 2

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

Добавлено: Вс сен 15, 2013 14:19:41
Andrew-77
Народ, не знаю куда точнее свою тему объявить, короче проблема такая, нужно прогу на Паскале переписать в Ассемблере для ПК. Кто может реально помочь? На Паскале написал, а вот в ассемблере уже бьюсь недели 3 и никак.

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

Добавлено: Вс сен 15, 2013 14:43:22
SERJ
Программу из "exe" конвертируете в «com» что бы знать с какого адреса она начинается и была в одном сегменте.
Загоняете её в «Debug». Лучше в чистом DOS
http://ru.wikipedia.org/wiki/Debug
Дальше выполняете команду «U» и получаете свою программу на ассемблере. :))

Изображение

http://www.xakep.ru/post/19870/

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

Добавлено: Вс сен 15, 2013 14:53:21
vem566
Andrew-77 писал(а): нужно прогу на Паскале переписать в Ассемблере для ПК

А зачем?

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

Добавлено: Вс сен 15, 2013 18:51:05
petrenko
Сразу так предполагаются два варианта : 1.) Преп. сказал так сделать. ( Тогда предложение "SERJ"- самое то, что надо.. :) )
2.) Хочет повысить эффективность зачем то - например даже на core-quad-dieci 3Ггц каком-нибудь нечто обсчитывается более 20 часов - а ему хотелось бы, чтоб за час ~ два хотя бы.
Ну может и ещё что другое оказаться причиной.. :dont_know:
( Ясновидение маленько до ДВ не дотягивает ( - далековато.. :) ), не получается разглядеть саму программу, а без текста вряд ли можно что то вразумительное посоветовать, увы.. )

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

Добавлено: Вс сен 15, 2013 19:28:21
vem566
petrenko писал(а):обсчитывается более 20 часов - а ему хотелось бы, чтоб за час ~ два хотя бы.

На 80% быстродействие зависит от алгоритма, остальное - язык, процессор и т. п.

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

Добавлено: Вс сен 15, 2013 19:57:35
petrenko
"Смайлик" я не просто так туда "приаттачил", между прочим.. :wink:

Прежде чем просить помочь перевести с одного на другое надо бы T.S. это самое "одно" то выложить наверное..
А то ( по аналогии ) вроде " переведите с английского на суахили, пожалуйста, но что именно перевести, я Вам не скажу".
Очередная проверка форумчан на ясновидение ? :dont_know:

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
:facepalm: :cry:
А ведь верно коллега сказал, что :
vem566 писал(а):На 80% быстродействие зависит от алгоритма, остальное - язык, процессор и т. п.

Но я и не предполагал, что бывает прямо вот так...

И позвольте полюбопытствовать, а таблица простых чисел у Вас где хранится ? Ну откуда Вы берёте очередное простое число ?
( Отвечать именно мне необязательно - это вопросы в первую очередь важны для Вашего более внимательного взгляда на Вашу программу - а для меня он по сути риторический, уж извините. )
И ещё - Вы блок-схему до написания рисовали ? Или раз преп. от Вас этого не требует, значит и не надо ? :dont_know:
Скажите, пожалуйста, как Вы понимаете само разложение числа на множители ? :roll:

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" и задание провалено. 8)
"Юстас - Алексу : Срочно пришлите в студию блок-схему ! Эксперты переделают для подбрасывания Рунге правдоподобную дезинформацию. " :wink:

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"
*, то продолжим цикл..

Звиняйте, ежели где ошибся..
Пойду посмотрю, вроде в каком то учебнике было нечто похожее на Вашу несчастную задачку. :roll:
Если вдруг окажется не на Трубо-Паскакале, а на Модула или на Форт - выкладывать ?
*_С "it`s a final countdoun" можно ознакомиться там : :music:
Спойлер"офтоп" и потому под "спойлером" :music:

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 на ассемблере.

А если код особо проверять не будут, на ассемблере можно много чепухи похожей написать, а результат вывести заранее просчитанный алгоритмом на паскале... авось прокатит? Это с расчетом на то что сроки горят... но на самом деле, это надо было раньше делать.