Паскаль в Ассемблер
- Andrew-77
- Первый раз сказал Мяу!
- Сообщения: 31
- Зарегистрирован: Пн сен 24, 2012 01:47:35
- Откуда: Томск
Паскаль в Ассемблер
Народ, не знаю куда точнее свою тему объявить, короче проблема такая, нужно прогу на Паскале переписать в Ассемблере для ПК. Кто может реально помочь? На Паскале написал, а вот в ассемблере уже бьюсь недели 3 и никак.
Re: Паскаль в Ассемблер
Программу из "exe" конвертируете в «com» что бы знать с какого адреса она начинается и была в одном сегменте.
Загоняете её в «Debug». Лучше в чистом DOS
http://ru.wikipedia.org/wiki/Debug
Дальше выполняете команду «U» и получаете свою программу на ассемблере.

http://www.xakep.ru/post/19870/
Загоняете её в «Debug». Лучше в чистом DOS
http://ru.wikipedia.org/wiki/Debug
Дальше выполняете команду «U» и получаете свою программу на ассемблере.

http://www.xakep.ru/post/19870/
Re: Паскаль в Ассемблер
Andrew-77 писал(а): нужно прогу на Паскале переписать в Ассемблере для ПК
А зачем?
-
petrenko
- Друг Кота
- Сообщения: 5321
- Зарегистрирован: Вт фев 21, 2012 13:51:55
- Откуда: Начинающий
- Контактная информация:
Re: Паскаль в Ассемблер
Сразу так предполагаются два варианта : 1.) Преп. сказал так сделать. ( Тогда предложение "SERJ"- самое то, что надо..
)
2.) Хочет повысить эффективность зачем то - например даже на core-quad-dieci 3Ггц каком-нибудь нечто обсчитывается более 20 часов - а ему хотелось бы, чтоб за час ~ два хотя бы.
Ну может и ещё что другое оказаться причиной..
( Ясновидение маленько до ДВ не дотягивает ( - далековато..
), не получается разглядеть саму программу, а без текста вряд ли можно что то вразумительное посоветовать, увы.. )
2.) Хочет повысить эффективность зачем то - например даже на core-quad-dieci 3Ггц каком-нибудь нечто обсчитывается более 20 часов - а ему хотелось бы, чтоб за час ~ два хотя бы.
Ну может и ещё что другое оказаться причиной..

( Ясновидение маленько до ДВ не дотягивает ( - далековато..
< виртуальная "кнопочка" >--( WWW ) <- Убедительная просьба интересующимся старыми компьютерами типа РК86 - не пишите в теме в барахолке, пишите Ваши вопросы в ( лс ) пожалуйста
Re: Паскаль в Ассемблер
petrenko писал(а):обсчитывается более 20 часов - а ему хотелось бы, чтоб за час ~ два хотя бы.
На 80% быстродействие зависит от алгоритма, остальное - язык, процессор и т. п.
-
petrenko
- Друг Кота
- Сообщения: 5321
- Зарегистрирован: Вт фев 21, 2012 13:51:55
- Откуда: Начинающий
- Контактная информация:
Re: Паскаль в Ассемблер
"Смайлик" я не просто так туда "приаттачил", между прочим..
Прежде чем просить помочь перевести с одного на другое надо бы T.S. это самое "одно" то выложить наверное..
А то ( по аналогии ) вроде " переведите с английского на суахили, пожалуйста, но что именно перевести, я Вам не скажу".
Очередная проверка форумчан на ясновидение ?
Прежде чем просить помочь перевести с одного на другое надо бы T.S. это самое "одно" то выложить наверное..
А то ( по аналогии ) вроде " переведите с английского на суахили, пожалуйста, но что именно перевести, я Вам не скажу".
Очередная проверка форумчан на ясновидение ?

< виртуальная "кнопочка" >--( WWW ) <- Убедительная просьба интересующимся старыми компьютерами типа РК86 - не пишите в теме в барахолке, пишите Ваши вопросы в ( лс ) пожалуйста
- Andrew-77
- Первый раз сказал Мяу!
- Сообщения: 31
- Зарегистрирован: Пн сен 24, 2012 01:47:35
- Откуда: Томск
Re: Паскаль в Ассемблер
Вообще нужно вставить кусок на ассемблере, и проверить время выполнения на ассемблере и на паскале,
Ввести 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.
Ввести 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.
-
petrenko
- Друг Кота
- Сообщения: 5321
- Зарегистрирован: Вт фев 21, 2012 13:51:55
- Откуда: Начинающий
- Контактная информация:
Re: Паскаль в Ассемблер
А ведь верно коллега сказал, что :
vem566 писал(а):На 80% быстродействие зависит от алгоритма, остальное - язык, процессор и т. п.
Но я и не предполагал, что бывает прямо вот так...
И позвольте полюбопытствовать, а таблица простых чисел у Вас где хранится ? Ну откуда Вы берёте очередное простое число ?
( Отвечать именно мне необязательно - это вопросы в первую очередь важны для Вашего более внимательного взгляда на Вашу программу - а для меня он по сути риторический, уж извините. )
И ещё - Вы блок-схему до написания рисовали ? Или раз преп. от Вас этого не требует, значит и не надо ?
Скажите, пожалуйста, как Вы понимаете само разложение числа на множители ?
< виртуальная "кнопочка" >--( WWW ) <- Убедительная просьба интересующимся старыми компьютерами типа РК86 - не пишите в теме в барахолке, пишите Ваши вопросы в ( лс ) пожалуйста
- Andrew-77
- Первый раз сказал Мяу!
- Сообщения: 31
- Зарегистрирован: Пн сен 24, 2012 01:47:35
- Откуда: Томск
Re: Паскаль в Ассемблер
Я понимаю потрепаться охота, но у меня край. Программа рабочая 100 %, все вопросы в код там все видно из условия. Нужно перегнать выделенный кусок в ассемблер, все вопросы после, если останеться желание. Если дело в деньгах, пишите договоримся
-
petrenko
- Друг Кота
- Сообщения: 5321
- Зарегистрирован: Вт фев 21, 2012 13:51:55
- Откуда: Начинающий
- Контактная информация:
Re: Паскаль в Ассемблер
Ладно, это я ворчу, придираюсь, есть такое.
Программа, скажем так, не очень оптимальная.. Ассемблер ускорит её в 1.5 ~ 2 раза в лучшем случае.
( А преп. не требует доказать правильность работы алгоритма ? Тогда Вам повезло ещё. )
Но шут бы с этой эффективностью, понятно, что зачёт надо сдавать.
Ассемблер какого процесора требуется применить ? ( Я не всех процессоров коды знаю, увы, их просто много разных. )
Программа, скажем так, не очень оптимальная.. Ассемблер ускорит её в 1.5 ~ 2 раза в лучшем случае.
( А преп. не требует доказать правильность работы алгоритма ? Тогда Вам повезло ещё. )
Но шут бы с этой эффективностью, понятно, что зачёт надо сдавать.
Ассемблер какого процесора требуется применить ? ( Я не всех процессоров коды знаю, увы, их просто много разных. )
< виртуальная "кнопочка" >--( WWW ) <- Убедительная просьба интересующимся старыми компьютерами типа РК86 - не пишите в теме в барахолке, пишите Ваши вопросы в ( лс ) пожалуйста
- Andrew-77
- Первый раз сказал Мяу!
- Сообщения: 31
- Зарегистрирован: Пн сен 24, 2012 01:47:35
- Откуда: Томск
Re: Паскаль в Ассемблер
Да в общем то 8086,...80486 из этой серии, вся идея задания и состоит в оптимизации по скорости с помощью ассемблера, я бы хоть и на Си написал, ну что под рукой было на том и сделал, а вот ассемблер для 8086... ну жопа. Для атмелей или пиков еще както, здесь аут
-
petrenko
- Друг Кота
- Сообщения: 5321
- Зарегистрирован: Вт фев 21, 2012 13:51:55
- Откуда: Начинающий
- Контактная информация:
Re: Паскаль в Ассемблер
Andrew-77 писал(а):..8086 , 80486 ...
x86 мне знаком, один цикл "for" Вам изображу сейчас, попробую , но мучаться со всем куском - не знаю, как настроение - пока тут дождь и не особо весело..
Andrew-77 писал(а):... вся идея задания и состоит в оптимизации по скорости с помощью ассемблера...
Но если идея задания такова, то агент "007" не справился с агентами "0.5" и "0.7" и задание провалено.
"Юстас - Алексу : Срочно пришлите в студию блок-схему ! Эксперты переделают для подбрасывания Рунге правдоподобную дезинформацию. "
< виртуальная "кнопочка" >--( WWW ) <- Убедительная просьба интересующимся старыми компьютерами типа РК86 - не пишите в теме в барахолке, пишите Ваши вопросы в ( лс ) пожалуйста
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Паскаль в Ассемблер
.. ассемблер не сложнее, чем любой другой, правда при программировании под DOS иногда нужно помнить о сегментах ... (486 значительно "жирнее" своего предшественника в плане возможностей ...)Andrew-77 писал(а): а вот ассемблер для 8086...
ЗЫ. для студентов рекомендую почитать В. Н. Пильщиков Программирование на языке ассемблера IBM PC
Re: Паскаль в Ассемблер
SERJ предлагал дизассемблирование с последующей сборкой. В результате будет точно такой же по скорости работы файл. Фактически отладчик не переписывает программу на ассемблер, а декодирует коды, который сваял компилятор при сборке исходного файла. Ничего оптимизировать он не будет.
petrenko все правильно говорит. И про таблицу простых чисел, и про, мягко говоря, не оптимальный алгоритм и про блок схему. Сама задача скорее из области академического интереса. Для понимания некоторых вещей весьма полезная. Но выходов, как часто бывает, два. Или все таки понять, где и как её можно разогнать, или диплом будет только подразумевать образование.
petrenko все правильно говорит. И про таблицу простых чисел, и про, мягко говоря, не оптимальный алгоритм и про блок схему. Сама задача скорее из области академического интереса. Для понимания некоторых вещей весьма полезная. Но выходов, как часто бывает, два. Или все таки понять, где и как её можно разогнать, или диплом будет только подразумевать образование.
-
petrenko
- Друг Кота
- Сообщения: 5321
- Зарегистрирован: Вт фев 21, 2012 13:51:55
- Откуда: Начинающий
- Контактная информация:
Re: Паскаль в Ассемблер
Цикл :
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. А на Д.В. дождь тоже сейчас ?
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. А на Д.В. дождь тоже сейчас ?
< виртуальная "кнопочка" >--( WWW ) <- Убедительная просьба интересующимся старыми компьютерами типа РК86 - не пишите в теме в барахолке, пишите Ваши вопросы в ( лс ) пожалуйста
Re: Паскаль в Ассемблер
Можно пойти и другим путем. Оптимизировать код паскаля, потом дизассемблер. Думаю, что раза в полтора можно увеличить скорость если просто оптимизировать код. Не алгоритм, а код.
Давненько проводил эксперименты. Но помнится, что цикл for работает раза в три дольше, чем цикл while, а оператор типа
a = a + 1 работает в десять(!) раз медленнее, чем Incr(a). Так что и в этом коде есть простор для творчества.
Давненько проводил эксперименты. Но помнится, что цикл for работает раза в три дольше, чем цикл while, а оператор типа
a = a + 1 работает в десять(!) раз медленнее, чем Incr(a). Так что и в этом коде есть простор для творчества.
-
petrenko
- Друг Кота
- Сообщения: 5321
- Зарегистрирован: Вт фев 21, 2012 13:51:55
- Откуда: Начинающий
- Контактная информация:
Re: Паскаль в Ассемблер
По эффективности - Форт - один из пятёрки "самых" до сих пор. Ассемблер супротив Форт даёт всего 10% - не более обычно.
И, да, оптимизировать надо алгоритм ещё на стадии блок-схемы, потому я и говорю, что "в студию, пожалуйста"..
И, да, оптимизировать надо алгоритм ещё на стадии блок-схемы, потому я и говорю, что "в студию, пожалуйста"..
< виртуальная "кнопочка" >--( WWW ) <- Убедительная просьба интересующимся старыми компьютерами типа РК86 - не пишите в теме в барахолке, пишите Ваши вопросы в ( лс ) пожалуйста
Re: Паскаль в Ассемблер
Судя по всему получается, что блок-схемы нет. Мужику просто нужно сдать зачет, и он готов за это заплатить.
Я не готов делать эту курсовую. На выходе из института что получим? Еще по одному диплому мне и petrenko?
А
Я не готов делать эту курсовую. На выходе из института что получим? Еще по одному диплому мне и petrenko?
А
я найду, чем заняться.petrenko писал(а):после ужина..
- Andrew-77
- Первый раз сказал Мяу!
- Сообщения: 31
- Зарегистрирован: Пн сен 24, 2012 01:47:35
- Откуда: Томск
Re: Паскаль в Ассемблер
Балаболов много, а дела мало. Это не курсовая, всего лишь половина небольшой контрольной, я просто по времени не успеваю разобраться в этом полность, потому и прошу помощи. Не нравиться код, оптимизируй, помоги, а еще лучше если такие крутые, перегоните в ассемблер, не дурак разберусь чтобы понять потом. Если бы не вопрос времени хрен бы я вообще спрашивал. От таких помощников ... это не комерческий проект, нахрен здесь не нужна ваша максимальная оптимизация, это просто легкий вариант сравнения одной и тойже программы на высоком и на низком, в каком угодно виде
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Паскаль в Ассемблер
вобщем да, хотел бы я посмотреть реализацию алгоритма деления на ассемблере...
А в общем, не так все плохо... на ассемблере надо реализовать сам алгоритм - чтобы не парится с вводом-выводом, этот алгоритм можно вставить в паскалевскую оболочку как процедуру сделанную полностью INLINE на ассемблере.
А если код особо проверять не будут, на ассемблере можно много чепухи похожей написать, а результат вывести заранее просчитанный алгоритмом на паскале... авось прокатит? Это с расчетом на то что сроки горят... но на самом деле, это надо было раньше делать.
А в общем, не так все плохо... на ассемблере надо реализовать сам алгоритм - чтобы не парится с вводом-выводом, этот алгоритм можно вставить в паскалевскую оболочку как процедуру сделанную полностью INLINE на ассемблере.
А если код особо проверять не будут, на ассемблере можно много чепухи похожей написать, а результат вывести заранее просчитанный алгоритмом на паскале... авось прокатит? Это с расчетом на то что сроки горят... но на самом деле, это надо было раньше делать.