Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2010, 00:25   #1
yukas
Пользователь
 
Регистрация: 12.05.2010
Сообщений: 10
По умолчанию Сопроцессор, пытаюсь вычислить выражение...

Пытаюсь вычислить выраженние:
Сумма (i изменяется от 1 до n). Выражение: (a-b)^2,где

a=(i,если i-нечетное;i/3-иначе)
b=(i^2,если i-нечетное, i^3-иначе)

Результат должен вернуть в программу на Си:
Цитата:
.model large
.stack 256
.data
summa dd 0
three dd 3
a dd ?
b dd ?
.code

PUBLIC _sum
_sum proc c near n:word

finit
fld summa
mov cx,n
L:
cmp cx,0
jne L0
jmp L1

L0:
xor dx,dx
mov ax,cx
mov bx,2
div bx
cmp dx,0
jne Necetnoe

Cetnoe:

push cx
pop a
fld three
fld a
fdiv three

push cx
pop b
fld b
fmul b
fmul b

fld a
fsub
fabs

fld a
fmul a

Necetnoe:

mov ax,cx
push ax
pop b
push cx
pop a
fmul

push cx
pop b

fld b
fld a

fsub
fabs
fld a
fmul a


Next:

fld a
fld summa
fadd
dec cx
jmp L

L1:

fld summa

ret

_sum endp

end
Помогите разобраться что к чему, тема для меня новая...
yukas вне форума Ответить с цитированием
Старый 12.05.2010, 10:43   #2
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

оберните в процедуру сами
Код:
fldz
@next:
  cmp n,0
  jz @end
  fild n
  fld st(0)
  fmul st(1), st(0)
  test n,1
  jz @chet
    fmul st(1),st(0)
    fdiv three
@chet:
  fsubp st(1),st(0)
  fmul st(0),st(0)
  faddp st(1),st(0)
  dec n
jmp @next
@end:
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Старый 12.05.2010, 11:37   #3
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Код:
.model tiny
.stack 256
.code

PUBLIC _sum
start:
push 10
call _sum
mov ax,4c00h
int 21h

;-----------------
_sum proc c near n:word
finit
mov cx,n
L:
test cx,1
jne Necetnoe
Cetnoe:
mov cs:i,cx
fild cs:i
fld cs:three
fdiv
mov cs:i,cx
fild cs:i
fld cs:three
fdiv
jmp Next
Necetnoe:
mov cs:i,cx
fild cs:i
fild cs:i
fild cs:i
fmul
Next:
fsub
fst cs:tmp
fld cs:tmp
fmul
fld cs:summa
fadd
fstp cs:summa
loop L
L1:
fld summa
ret
summa dd 0
three dd 3.0
tmp dd ?
a dd ?
b dd ?
i dw ?
_sum endp

end start
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 12.05.2010, 15:45   #4
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

вы программы проверяли? помоему переполнит стек fpu
Цитата:
Сообщение от alexcoder Посмотреть сообщение
Код:
.model tiny
.stack 256
.code

PUBLIC _sum
start:
push 10
call _sum
mov ax,4c00h
int 21h

;-----------------
_sum proc c near n:word
finit
mov cx,n
L:
test cx,1
jne Necetnoe
Cetnoe:
mov cs:i,cx
fild cs:i       ; зачем задвоено?
fld cs:three
fdiv            ; fdiv st(0), st(1) 3/i?
mov cs:i,cx
fild cs:i
fld cs:three
fdiv
jmp Next
Necetnoe:
mov cs:i,cx
fild cs:i
fild cs:i
fild cs:i
fmul
Next:
fsub
fst cs:tmp
fld cs:tmp
fmul
fld cs:summa
fadd
fstp cs:summa
loop L
L1:
fld summa
ret
summa dd 0
three dd 3.0
tmp dd ?
a dd ?
b dd ?
i dw ?
_sum endp

end start
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Старый 12.05.2010, 22:39   #5
yukas
Пользователь
 
Регистрация: 12.05.2010
Сообщений: 10
По умолчанию

Все равно не получается.
возвращает не то, что нужно...я попробовал сам что-то сделать, но не работает тоже..может глянете:

Цитата:
.model large
.stack 256
.data
summa dd 0
three dd 3.0
a dd ?
b dd ?
.code
PUBLIC _sum
_sum proc c near n:word

finit
mov dx,n
inc dx
mov kol,dx
mov cx,1
L:
cmp cx,kol
jne L0
jmp L1

L0:
xor dx,dx
mov ax,cx
mov bx,2
div bx
cmp dx,0
jne Necetnoe

Cetnoe:
push cx
fst a
fld three
fdiv a

push cx
fst b
fld b
fmul b
fld b
fmul b


Necetnoe:

push cx
fst a

push cx
fst b
fld b
fmul b

Next:
fld b
fld a
fsub
fld a
fabs
fmul a
fld summa
fadd
inc cx
jmp L

L1:

fld summa

ret

_sum endp

end
yukas вне форума Ответить с цитированием
Старый 13.05.2010, 08:17   #6
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

не получается получить результат в Си или программа не правильно считает?
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Старый 13.05.2010, 08:25   #7
yukas
Пользователь
 
Регистрация: 12.05.2010
Сообщений: 10
По умолчанию

ошибка при компиляции, пишет fixup overflow
yukas вне форума Ответить с цитированием
Старый 13.05.2010, 09:44   #8
yukas
Пользователь
 
Регистрация: 12.05.2010
Сообщений: 10
По умолчанию

Добился того, что компилируется(ошибка была в модели памяти как выяснил). Теперь программа запускается, но значение в си не выводит, а сразу завергается, а иногда и вовсе вылетает...привожу код на обоих языках:
Цитата:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include "mylib.h"

extern "C" float sum(int);

void main()
{
float s;
int n;
clrscr();
n=atoi_s_proverkoi("Vvedite kolicestvo: ",1,10);
s=sum(n);
printf("Summa= %f",s);
getch();
}
Цитата:
.model small
.stack 256
.data
summa dd 0
three dd 3.0
kol dw ?
a dd ?
b dd ?
.code
PUBLIC _sum
_sum proc c far n:word

finit
mov dx,n
inc dx
mov kol,dx
mov cx,1
L:
cmp cx,kol
jne L0
jmp L1

L0:
xor dx,dx
mov ax,cx
mov bx,2
div bx
cmp dx,0
jne Necetnoe

Cetnoe:
push cx
pop a
fld three
fdiv a

push cx
pop b
fld b
fmul b
fld b
fmul b


Necetnoe:

push cx
pop a

push cx
pop b
fld b
fmul b

Next:
fld b
fld a
fsub
fld a
fabs
fld a
fmul a
fld a
fld summa
fadd
inc cx
jmp L

L1:

push summa

ret

_sum endp

end
yukas вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычислить выражение, если дано натуральное число elemigrante Помощь студентам 2 26.02.2010 14:15
вычислить выражение Jereme Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 08.01.2010 16:21
Вычислить выражение ai\ekcah^p Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 04.12.2009 17:06
Задача: Дано натуральное число n. Вычислить выражение ... NoSiK Помощь студентам 26 21.11.2009 14:46
вычислить выражение (Delphi 7) Olesya2406 Помощь студентам 1 22.04.2009 13:41