IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

> ассемблерная вставка в Delphi, макросы
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

Репутация: -  1  +


доброго дня
необходимо вычислить интеграл методом прямоугольников (ассемблерная вставка в Delphi или в паскаль)
сам метод мне понятен
но, на каждом шаге мне нужно будет вычислять значение функции в определенной точке. хотел было использовать макросы
но не тут то было, ни паскаль ни Delphi макросы не принимают
может я неправильно описываю эти макросы?
var n,a,b: integer;
res, h, x: real;
begin
readln(n);
a:=0;
b:=1;
asm
fild b
fisub a
fidiv n
call funct
funct proc
...

[Error] Project1.dpr(18): Undeclared identifier: 'funct'
думал что макросы описываются след образом:
<имя> macro парам1, парам2... парам N
...
...набор команд
...
endm
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Не верю smile.gif Ты просто не доделал метод прямоугольников. Вот код, вычисляющий значение и на Ассемблере, и на Паскале:

program Project1;

{$APPTYPE CONSOLE}
uses math;

var n, a, b: integer;
res, h, x: real;

i : Integer;
begin
// readln(n);
n := 15000;

a := 0;
b := 1;
x := 0;
res := 0;
asm
fild b
fisub a
fidiv n
fst h

mov ecx, n
fld x
@m:
fadd st, st(1)
fld st(0)
fptan
fdivp st(1), st
fadd res
fstp res
loop @m;

fld res
fmul st, st(2)
fstp res
end;
writeln(res:5:4);

// Test
h := (b - a) / n;
x := 0;
res := 0;
for i := 1 to n do
begin
x := x + h;
res := res + tan(x);
end;
res := res * h;
writeln(res:5:4);

readln;
end.
Чем выше N - тем выше точность. А так значения абсолютно одинаковые.

Сообщение отредактировано: IUnknown -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
marwell   ассемблерная вставка в Delphi   24.05.2012 16:17
IUnknown   MACRO встроенным ассемблером не поддерживается. По…   24.05.2012 16:43
marwell   var n,a,b: integer; res, h, x: real; begin rea…   24.05.2012 18:07
marwell   аа, дело в fdivr st(1),st кажется там на каждом ша…   24.05.2012 18:28
IUnknown   А кто тебе сказал, что происходит деление на 0? :)…   24.05.2012 18:29
marwell   сорри, успел отредактировать свое предыдущее сообщ…   24.05.2012 18:33
IUnknown   Посмотри на содержимое стека FPU. Сколько там оста…   24.05.2012 18:41
marwell   спасибо! var n,a,b: integer; res, h, x: re…   24.05.2012 19:00
IUnknown   Функция какая у тебя, тангенс или котенгенс? Если …   24.05.2012 19:27
marwell   Функция какая у тебя, тангенс или котенгенс? Если…   24.05.2012 20:00
IUnknown   FPC не ругается, в Дельфи сейчас посмотрю. Update…   24.05.2012 20:29
marwell   FPC не ругается, в Дельфи сейчас посмотрю. Updat…   24.05.2012 20:49
IUnknown   Не верю :) Ты просто не доделал метод прямоугольни…   24.05.2012 21:41
marwell   Не верю :) Ты просто не доделал метод прямоугольн…   24.05.2012 21:57


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 11.08.2022 13:20
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name