Проблема со стеком в сопроцессоре.

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
St. Andrew
Сообщения: 2
Зарегистрирован: 28 ноя 2005, 22:46

Уважаемые коллеги, помогите пожалуйста! У меня на второй итерации цикла возникает ошибка о переполнении стека... Уже долго парюсь, но никак не могу найти то место. где переполняется стек. Ошибка возникает на второй итерации цикла в районе команды fyl2x. Если не трудно - подскажите!

Код: Выделить всё

mov cx, 639     {grafik}
@loopx:
mov x, cx
cmp cx, 300
jl @bad_x
fild x
fmul gradus

wait
{call exponent }
push cx
xor cx,cx
fld1
fld e
fyl2x
fld1
fadd
fmul
fst mem
fld1
fcom
fstsw ax
sahf
jnc @m2
xor cx, cx
@m12:
inc cx
fsub
fst mem
fld1
fcom
fstsw ax
sahf
jz @m12
jnc @m2
jmp @m12
@m2:
mov step, cx

fxch
f2xm1
fadd
fild step
fld1
fscale
fxch
fincstp
fmul
fstp y
pop cx
jmp @1
@2: jmp @loopx
@1:

fild x
fmul gradus
DB 0D9h, 0FEH
fild sto
fmul
fld y
fmul
fst y



fidiv mnogitel {rastjagivaem gfafik po y}
fchs
fadd b
frndint
fistp y2

mov ah, 0ch
mov bh,0h
mov dx, y2
mov al, 15
int 10h
@bad_x:
loop @2
mov ah, 8
int 21h
Программа строит по точкам график 100sin(x)*(2e)^x... Пишу ввиду необходимости на встроенном ассемблере Паскаля.
(GiG)*fh
Сообщения: 48
Зарегистрирован: 05 ноя 2004, 14:08
Откуда: Russia
Контактная информация:

Приведи всю программу, так не понятно
И пусть удача повернется к тебе нужным местом :)
St. Andrew
Сообщения: 2
Зарегистрирован: 28 ноя 2005, 22:46

(GiG)*fh, ок! Вот она вся:

Код: Выделить всё

{$N+}
{$G+}
Program kostja2;
uses crt{, graph};
var
x,dx,i,y2,a,c,os,mnogitel, step, sto: word;
y, gradus, b, e,mem: double;
bit :byte;

{grDriver: integer;
grMode: integer;
Errcode: integer;}

begin
clrscr;
{grDriver:=EGA;
grMode:=EGAHi;
InitGraph(grDriver, grMode,'');
ErrCode:=GraphResult;
if ErrCode<>grOK then Halt(1); }

mnogitel:=10000; {koefficient rastjagivanija po y}
c:=6;
a:=2;
b:=200;
sto:=100;
gradus:=1/97;  {koefficient rastjagivanija po x}
e:=2.73;
asm
mov ax, 0     {vkl. grafiku}
mov al, 10h
int 10h

mov ah, 0ch    {osi}
mov al, 10
mov cx, 400
mov bh, 0h
mov dx, 0
@metka1:
push cx
mov os, cx
mov dx, os
mov cx,0
int 10h
pop cx
loop @metka1

mov ah, 0ch
mov al, 10
mov cx, 639
mov bh, 0h
mov dx, 200
@metka2:
int 10h
loop @metka2


mov cx, 639     {grafik}
@loopx:
mov x, cx
cmp cx, 280
jl @bad_x
fild x
fmul gradus

wait
{count exponent}
push cx
xor cx,cx
fld1
fld e
fimul a
fyl2x
fmul
fst mem
fld1
fcom
fstsw ax
sahf
jnc @m2
xor cx, cx
@m12:
inc cx
fsub
fst mem
fld1
fcom
fstsw ax
sahf
jz @m12
jnc @m2
jmp @m12
@m2:
mov step, cx

fxch
f2xm1
fadd
fild step
fld1
fscale
fxch
fincstp
fmul
fstp y
pop cx

{st(0)=(2e)^x}

jmp @1         {prosto metki dlja dlinnogo perehoda}
@2: jmp @loopx
@1:


fild x
fmul gradus
DB 0D9h, 0FEH {fsin}
fild sto
fmul
fld y
fmul          {full func is done!}



fidiv mnogitel {rastjagivaem gfafik po y}
fchs
fadd b
frndint
fistp y2       {y2 - koord. y tochki na ekrane; cx - koord. x}

mov ah, 0ch    {vivod}
mov bh,0h
mov dx, y2
mov al, 15
int 10h

@bad_x:
loop @2
mov ah, 8
int 21h

end;

{readln;
CloseGraph;}
end.
Ответить