Полная засада с ассемблером, помогите кто чем может!!!
теперь обращаюсь к вам, как к последней надежде!!!
нужно написать прогу на ассемблере:
Рзложение функций (sin, cos, tg, e^x, a^x и других) в ряд Тейлора используя длинную арифметику (не менее 200 розрядов)(сама и понятия не имею, что это за фигня, погуглю, результаты выложу)
я порылась в нете но ничего особого там не нашла...
все что нашла....
Разложение синуса в ряд Тейлора
Задача:
Используя разложение в ряд Тейлора найти значение sin(x) с заданной точностью e.
Код:
program sin_teilor;
var x,stx,sint,e: real;
i,fakt,z: integer;
Begin
Write('Введите x: ');
Readln(x);
Write('Введите точность e: ');
Readln(e);
stx:= x; {x в степени}
fakt:= 1; {значение факториала в знаменателе}
sint:= 0; {первый элемент в разложении}
i:= 1; {счётчик}
z:= 1; {знак элемента}
while stx/fakt>=e do begin {до тех пор, пока элемент в разложении не меньше точности}
sint:=sint+z*stx/fakt;
inc(i,2);
stx:=stx*x*x;
fakt:=fakt*(i-1)*i;
z:=z*(-1); {смена знака}
end;
Writeln('Количество элементов в разложении = ',i div 2);
Writeln('Значение sin(',x:6:6,')= ',sint:6:6);
Writeln('Значение компьютера: ',sin(x):6:6);
Readln;
End.
Разложение ex в ряд Тейлора
ЗАДАЧА:
Используя разложение в ряд Тейлора найти значение ex с заданной точностью e.
КОД:
program ex_teilor;
var x,stx,ex,e: real;
i,fakt: integer;
Begin
Write('Введите x: ');
Readln(x);
Write('Введите точность e: ');
Readln(e);
stx:=x; {x в степени}
fakt:=1; {значение факториала в знаменателе}
ex:=1; {первый элемент в разложении}
i:=1; {счётчик}
while stx/fakt>=e do begin {до тех пор, пока элемент в разложении не меньше точности}
ex:=ex+stx/fakt;
inc(i);
stx:=stx*x;
fakt:=fakt*i;
end;
Writeln('Количество элементов в разложении = ',i+1);
Writeln('Значение e^',x:6:6,'= ',ex:6:6);
Writeln('Значение компьютера: ',exp(x):6:6);
Readln;
End.
Разложение ln(x) в ряд Тейлора
ЗАДАЧА:
Используя разложение в ряд Тейлора найти значение ln(x) с заданной точностью e.
ОПИСАНИЕ:
КОД:
program lnx_teilor;
var x,stx,lnt,e: real;
i,fakt,z: integer;
Begin
Write('Введите 1 < x < 2: ');
Readln(x);
Write('Введите точность e: ');
Readln(e);
stx:= x-1; {x в степени}
fakt:= 1; {значение знаменателя}
lnt:= 0; {первый элемент в разложении}
i:= 1; {счётчик}
z:= 1; {знак элемента}
while stx/fakt>=e do begin {до тех пор, пока элемент в разложении не меньше точности}
lnt:=lnt+z*stx/fakt;
inc(i);
stx:=stx*(x-1);
fakt:=i;
z:=z*(-1); {смена знака}
end;
Writeln('Количество элементов в разложении = ',i);
Writeln('Значение ln(',x:6:6,')= ',lnt:6:6);
Writeln('Значение компьютера: ',ln(x):6:6);
Readln;
End.
Разложение косинуса в ряд Тейлора
ЗАДАЧА:
Используя разложение в ряд Тейлора найти значение cos(x) с заданной точностью e.
ОПИСАНИЕ:
КОД:
program cos_teilor;
var x,stx,cost,e: real;
i,fakt,z: integer;
Begin
Write('Введите x: ');
Readln(x);
Write('Введите точность e: ');
Readln(e);
stx:= x*x; {x в степени}
fakt:= 2; {значение факториала в знаменателе}
cost:= 1; {первый элемент в разложении}
i:= 2; {счётчик}
z:= -1; {знак элемента}
while stx/fakt>=e do begin {до тех пор, пока элемент в разложении не меньше точности}
cost:=cost+z*stx/fakt;
inc(i,2);
stx:=stx*x*x;
fakt:=fakt*(i-1)*i;
z:=z*(-1); {смена знака}
end;
Writeln('Количество элементов в разложении = ',i div 2 + 1);
Writeln('Значение cos(',x:6:6,')= ',cost:6:6);
Writeln('Значение компьютера: ',cos(x):6:6);
Readln;
End.
Разложение гиперболического синуса в ряд Тейлора
ЗАДАЧА:
Используя разложение в ряд Тейлора найти значение sh(x) с заданной точностью e.
ОПИСАНИЕ:
КОД:
program sh_teilor;
var x,stx,sh,e: real;
i,fakt: integer;
Begin
Write('Введите x: ');
Readln(x);
Write('Введите точность e: ');
Readln(e);
stx:=x; {x в степени}
fakt:=1; {значение факториала в знаменателе}
sh:=0; {первый элемент в разложении}
i:=1; {счётчик}
while stx/fakt>=e do begin {до тех пор, пока элемент в разложении не меньше точности}
sh:=sh+stx/fakt;
inc(i,2); {увеличение i на 2}
stx:=stx*x*x;
fakt:=fakt*(i-1)*i;
end;
Writeln('Количество элементов в разложении = ',i div 2);
Writeln('Значение sh(',x:6:6,')= ',sh:6:6);
Readln;
End.
Разложение гиперболического косинуса в ряд Тейлора
ЗАДАЧА:
Используя разложение в ряд Тейлора найти значение ch(x) с заданной точностью e.
ОПИСАНИЕ:
КОД:
program ch_teilor;
var x,stx,ch,e: real;
i,fakt: integer;
Begin
Write('Введите x: ');
Readln(x);
Write('Введите точность e: ');
Readln(e);
stx:= x*x; {x в степени}
fakt:= 2; {значение факториала в знаменателе}
ch:= 1; {первый элемент в разложении}
i:= 2; {счётчик}
while stx/fakt>=e do begin {до тех пор, пока элемент в разложении не меньше точности}
ch:=ch+stx/fakt;
inc(i,2);
stx:=stx*x*x;
fakt:=fakt*(i-1)*i;
end;
Writeln('Количество элементов в разложении = ',i div 2 + 1);
Writeln('Значение ch(',x:6:6,')= ',ch:6:6);
Readln;
End.
Для masm32: (количество членов ряда задается в переменной n)
Код ASM
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\fpu.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\fpu.lib
BSIZE equ 30
.data
z2 dt 0.0
elem dt 0.0
rez dt 0.0
n dd 10
counter dd 0
buf1 db '6.28',0
.data?
z dt ?
buf db BSIZE dup (?)
.code
main proc
LOCAL hOutPut :DWORD
LOCAL hInput :DWORD
LOCAL nRead :DWORD
LOCAL nWriten :DWORD
finit
invoke GetStdHandle,STD_INPUT_HANDLE
mov hInput, eax
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov hOutPut, eax
invoke ReadConsole, hInput, addr buf, BSIZE, ADDR nRead, NULL
mov ebx, nRead
xor al, al
mov [buf+ebx-2], al
invoke FpuAtoFL, addr buf, addr z, DEST_MEM
fld1
fld1
fstp rez
fstp elem
fld z
fld st(0)
fmul
fstp z2
mov ecx, n
l:
inc counter
fild counter
fld st
fadd
fld st
fld1
fsub
fmul
fld z2
fdivr
fchs
fld elem
fmul
fld st
fstp elem
fld rez
fadd
fstp rez
loop l
invoke FpuFLtoA, ADDR rez,10, ADDR buf, SRC1_REAL or SRC2_DIMM
invoke WriteConsoleA, hOutPut, ADDR buf, BSIZE, ADDR nWriten, NULL
invoke ExitProcess,0
main endp
end main
еще раз прошу помогите, а то мне будут кранты
http://uk.wikipedia.org/wiki/%D0%A0%D1%8F%D0%B4_%D0%A2%D0%B5%D0%B9%D0%BB%D0%BE%D1%80%D0%B0
http://sesia5.ru/vmat/gl2/r7.htm
http://www.nsu.ru/matlab/Exponenta_RU/educat/class/courses/ma/theme24/theory.asp.htm
и про длинную арифметику: http://e-maxx.ru/algo/big_integer
Мне хотя бы полную прогу для парочки функций возможно я тогда как-то по примеру смогу сделать....
Пишем прогу на С/Паскале как консольное приложение, компилем.
Берем дизасемблер, дизасемблируем.
???
У нас готовые программы :)
Ну это на первый взгляд. А сейчас посмотрю что как, да помочь попытаюсь.
А можно задание поточнее сформулировать.
Чем можно пользоваться, чем нельзя? Макросы, внешние библиотеки? Какой ассемблер предпочтителен, msam, tasm? Больше информации :)
нам вообще никто ничего не сказал.... :confused:
на чем напишете на том и будет....
по поводу что можно использовать а что нет, тоже ничего не известно (но если смотреть по тому что мы учили, то это простейшие матем. функции, простейшие цыклы и процедурки...ничего замысловатого) и тех страшных слов тоже не встречалось )))
но если вы вдруг возьметесь это написать,то пишите как можете))) ну хоть немного коментариев, что б мне было хоть что-то понятно)))
Второе, что меня смутило, так это разложение в ряд именно Тейлора, хотя не скриншотах немного другое. Так что нужно? Сфотографируйте задание или перепечатайте его. Я не телепат.
В третьих, может ну его, ассемблер. На такую задачу и в С/Паскале не один вечер потратишь, а код на ассемблере получишь в любом случаи. Лучше разобраться в нем, чем писать его с нуля. А можно и не разбираться, а просто понаписать немного комментариев. Преподаватели в листинг асьмы не особо вникают...
В четвертых, я писать все не хочу, да и не могу, но помогать советами всегда готов.
Первое, что вам надо сделать - четко составить Техническое задание на основе поставленной задачи, а уже потом обращаться за помощью. Главное в нашем деле - меньше эмоций.
скриншоты взяты уже с нета, в самом задании их не было, первый абзац и есть полностью перепечатанное задание...
тоесть вы предлагаете написать прогу на Делфи (ну это то что я более менее знаю, и смогу что-то написать) (кстати писать надо в консольке же???) и потом с помощью дизассемблера переконвертить в асм???
а этот асмовский код...будет нормальным?? ))
(вы простотите что так спрашиваю, просто как-то терзают смутные сомнения... особенно ког-да вспоминаю все переводчики, как они коверкают слова... боюсь что и здесь может так же получиться, мне же нужно что бы та прога на асме еще и работала потом...)
но если все с ним нормально, то какой дизасемблер вы лучше посоветуете скачать???
Я пользуюсь IDA, например. Но подойдет любой, разницы для нашей задачи нет.
Писать приложение придется консольное, никто не поверит, что на асьме кто-то написал оконное приложение:)
Ой ли?Могу предоставить несколько своих оконных
По теме:«в консольке» писать не придётся.И вообще,это лучше на Паскале делать,т.к. Delphi ещё лишнего кода напихает,ввек не разберётесь
а как же сопроцессор? те же sin\cos там 100% есть.
По теме:«в консольке» писать не придётся.И вообще,это лучше на Паскале делать,т.к. Delphi ещё лишнего кода напихает,ввек не разберётесь
Я не говорил, что нельзя написать оконное приложение. Цепляешь виндовские дллки и поехали. Я говорил, что на курсач это точно не надо. Вызовет в первую очередь недоверие преподавателя, ассемблер же не читали и вдруг студент приносит оконное приложение. Зная, что существует дизассемблер, вполне можно предположить, о чем подумает комиссия.
А то, что писать на делфи не очень хорошо, я вполне согласен. Может добавить много лишнего, но если убрать оптимизацию, то не должен. Паскаль тот же делфи, проблем в перекомпиляции кода возникнуть не должно, если есть программа на делфи, в конце концов.
[QUOTE=Norgat]а как же сопроцессор? те же sin\cos там 100% есть.[/QUOTE]
Да, забыл про fsin и fcos. Но все равно это поможет мало, ибо для длинной арифметики это не приспособлено, по мне, так уж лучше написать рядами, реализовать только сложение, а там уж лупами как-нибудь:)
я написала прогу на Паскале, потом ее дезасемблировала....
но там вышло тааак всего много что мне не разгребтись самой....
а курсач здавать уже на этой неделе надо (((
помогите пожалйста а то я не знаю, че там надо , а че нет....:(
Не, надо не так. Надо поставить точки останова в нужных функциях, и после останова нажать Ctrl+Shift+C, чтобы показалось окно ассемблерных команд. В Delphi 2006 оттуда можно сразу копировать текст.
Вроде самое простое, что доступно без шаманства.
у меня делфи 2007 (хотя от этого разницы наверное особой не должно быть...)
блин..ну помогите, пожалуйста....
может по моему паскалю кто-то сможет написать на асме или дезасемблировать по-человечески ....(((