2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу 1, 2  След.
 
 циклы (и не только) в ассемблерных вставках
Сообщение19.04.2011, 20:21 
написала программу на си..помогите преобразовать вычисления в ассемблер...

код: [ скачать ] [ спрятать ]
Используется синтаксис C
#include <stdio.h>
#include <locale.h>
#include <conio.h>
#include <math.h>

main(){
float dx=0.1,dy=0.05,xmin=-0.5,ymin=0.0,xmax=1.2,ymax=0.4,i,j,f,st;
float e=2.71828;
setlocale(LC_ALL,"Russian");
for(i=xmin,j=ymin;i<xmax+dx,j<ymax+dy;i+=dx,j+=dy)
{
        if(i>=j){
                f=logf(fabsf(i/(1+j)));
                printf("значение функции при x=%5.3f,y=%5.3f равно %5.3f",i,j,f);
                }
                else { st=fabsf(i+j);
                        f=(1+i)/(1+j)/pow(e,st);
                        printf("значение функции при x=%5.3f,y=%5.3f равно %5.3f",i,j,f);
                        }
}
getch();
return 0;
}

 
 
 
 Re: циклы (и не только) в ассемблерных вставках
Сообщение19.04.2011, 21:01 
Поищите про JZ, JNZ и прочие страшные J….

А ещё про сопроцессор для вычислений с плавающей точкой. (И вообще, хотя преобразовывать предполагается и не его, а из него, код недостаточно правильно оформлен.)

Перечислите конкретные затруднения.

 
 
 
 Re: циклы (и не только) в ассемблерных вставках
Сообщение19.04.2011, 21:16 
Цитата:
Поищите про JZ, JNZ и прочие страшные J….
они с вещественными не катят((но эт пол беды

в основном не могу разобраться с
1)вычислением модуля
2)вычислением логарифма
3)проверкой условия

да и вообще с ассемблером туго..особенно с типом float((

Цитата:
код недостаточно правильно оформлен

а можно подробнее?

 
 
 
 Re: циклы (и не только) в ассемблерных вставках
Сообщение19.04.2011, 21:18 
Я вот это зачем написал?:
arseniiv в сообщении #436818 писал(а):
А ещё про сопроцессор для вычислений с плавающей точкой.

(Об оформлении кода.)

fenek в сообщении #436822 писал(а):
а можно подробнее?
Хотя бы подблоки [что-то я забыл их общепринятое название] в операторе if должны иметь один и тот же отступ, а не разные. Они не находятся в подчинении друг у друга. Пробелы в некоторых местах тоже не были бы лишними, хотя не все стандарты оформления кода их включают. (Если не получится, покажу образец.)

 
 
 
 Re: циклы (и не только) в ассемблерных вставках
Сообщение19.04.2011, 22:34 
гм..ну я растыка.знаю..

читаю..ток не оч помогает..*при отсутствии мозга*
пытаюсь написать,но такая чушь((

-- Вт апр 19, 2011 22:45:55 --

появились другие вопросы:
как
*возвести число в степень
*очистить весь стек

 
 
 
 Re: циклы (и не только) в ассемблерных вставках
Сообщение20.04.2011, 16:20 
Для возведения в степень может быть полезна формула $b^a = e^{a\ln b}$ (для возведения в квадрат лучше умножить на себя — быстрее немного будет).

 
 
 
 Re: циклы (и не только) в ассемблерных вставках
Сообщение20.04.2011, 20:20 
А зачем Вам ассемблер понадобился?

Тот выигрыш в скорости, что можно получить, переписав алгоритм на ассемблере ничтожен по сравнению с выигрышем от оптимизации алгоритма.

Грубо говоря, никакой ассемблер не позволит Вам посчитать определитель 30*30 по определению (как сумму 30! слагаемых).

 
 
 
 Re: циклы (и не только) в ассемблерных вставках
Сообщение20.04.2011, 22:26 
alex1910, мне он в принципе ни к чему..но в универе требуют(((

 
 
 
 Re: циклы (и не только) в ассемблерных вставках
Сообщение29.04.2011, 00:01 
2fenek
Скажу вам по-секрету, многие компиляторы могут генерировать промежуточный ассемблерный листинг. Пишите код, компилируете и смотрите, что получилось. Заодно поймете насколько тупы бывают современные компиляторы (в принципе, это то, о чем говорил alex1910).

 
 
 
 Re: циклы (и не только) в ассемблерных вставках
Сообщение03.05.2011, 18:41 
Circiter, попытка разобрать "промежуточный ассемблерный листинг" не увенчалась успехом..
програмку накалякала,но: работать отказывается, компилятор ошибок не выдает. помогите разобраться,плиз

код: [ скачать ] [ спрятать ]
Используется синтаксис ASM
{...
f=0;k=0.694;
__asm{
finit
fld xmin        ;загрузить xmin в st(0)
fstp i          ;выгрузить st(0) в i
fld ymin        ;загрузить ymin в st(0)
fstp j          ;выгрузить st(0) в j

for_begin:      ;начало цикла
fld i           ;загрузить i в st(0)
fcomp xmax      ;сравнить i и xmax
fstsw ax        ;поместить состояние в EAX
sahf            ;поместить содержимое AH в Eflags
jg exit         ;если больше - выход из цикла
fld j           ;загрузить j в st(0)
fcomp ymax      ;сравнить j и ymax
fstsw ax        ;поместить состояние в EAX
sahf            ;поместить содержимое AH в Eflags
jg exit         ;если больше - выход из цикла
fld i           ;загрузить i в st(0)
fcomp j         ;сравнить i и j
fstsw ax        ;поместить состояние в EAX
sahf            ;поместить содержимое AH в Eflags
jl fun2         ;если меньше - функция 2

fun1:           ;функция 1
fld1            ;загрузить 1 в st(0)
fadd j          ;прибавить j к st(0)
fstp f
fld i           ;загрузить i в st(1)
fdiv i          ;деление i на f
fabs            ;взять модуль от st(0)
fstp f          ;выгрузить значение в f
;вычисление ln|x/(1+y)|=ln f    
fld k
fld f
fyl2x
fstp f
jmp pr

fun2:           ;функция 2

fld1            ;загрузить 1 в st(0)
fadd i          ;прибавить i к st(0)
fstp f          ;выгрузить значение в f
fld1            ;загрузить 1 в st(0)
fadd j          ;прибавить j к st(0)
fdiv f          ;деление f на st(0)
fstp f          ;выгрузить значение в f
;вычисление e^|i+j|    
fld i           ;загрузить i в st(0)
fadd j          ;прибавить j к st(0)
fabs
fld e
fyl2x
fld st(0)
frndint
fsubr st(0),st(1)
f2xm1
fld1
faddp st(1),st(0)
fscale
fxch st(1)
fstp st

fstp z
fld f
fld z
fdiv
fstp f
jmp pr

label:
fld i
fadd x
fstp i
fld j
fadd y
fstp j
jmp for_begin

}
pr:{printf("\n----------------------------------------------------------- \n");
printf("значение функции asm при x=%5.3f,y=%5.3f равно %5.3f\n",i,j,f);
goto label;}

exit:
...}

 
 
 
 Re: циклы (и не только) в ассемблерных вставках
Сообщение03.05.2011, 19:46 
Цитата:
Используется синтаксис ASM
;вычисление e^|i+j|    
fld i           ;загрузить i в st(0)
fadd j          ;прибавить j к st(0)
fabs
fld e
Погодите-ка, мне кажется, или вы для $\exp\left| a+b \right|$ загружаете $e$ и возводите в степень? Разве для этого нет чего-нибудь типа fexp?

 
 
 
 Re: циклы (и не только) в ассемблерных вставках
Сообщение03.05.2011, 20:11 
хм..вроде как нет

 
 
 
 Re: циклы (и не только) в ассемблерных вставках
Сообщение03.05.2011, 20:50 
И вообще, что-то вы там, похоже, химичите. Вам, наверно, нужен натуральный логарифм? А в коде двоичный. Оба раза. Ещё есть подозрения, но я ужасно знаю ассемблер, и оставлю их при себе.

 
 
 
 Re: циклы (и не только) в ассемблерных вставках
Сообщение03.05.2011, 20:52 
В процессорах Интел принято возводить в степень двойку. См. команду F2XM1.
Логарифмируют тоже по основанию 2: FYL2X и FYL2XP1. Заодно можно сразу умножить на нужную константу, типа $\frac 1 {\ln 2}$.

 
 
 
 Re: циклы (и не только) в ассемблерных вставках
Сообщение03.05.2011, 21:03 
Код:
;вычисление ln|x/(1+y)|=ln f   
fld k
fld f
fyl2x
fstp f
В этом куске нет умножения.

 
 
 [ Сообщений: 18 ]  На страницу 1, 2  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group