2014 dxdy logo

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

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




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


22/12/10
15
написала программу на си..помогите преобразовать вычисления в ассемблер...

код: [ скачать ] [ спрятать ]
Используется синтаксис 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 
Заслуженный участник


27/04/09
28128
Поищите про JZ, JNZ и прочие страшные J….

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

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

 Профиль  
                  
 
 Re: циклы (и не только) в ассемблерных вставках
Сообщение19.04.2011, 21:16 


22/12/10
15
Цитата:
Поищите про JZ, JNZ и прочие страшные J….
они с вещественными не катят((но эт пол беды

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

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

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

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

 Профиль  
                  
 
 Re: циклы (и не только) в ассемблерных вставках
Сообщение19.04.2011, 21:18 
Заслуженный участник


27/04/09
28128
Я вот это зачем написал?:
arseniiv в сообщении #436818 писал(а):
А ещё про сопроцессор для вычислений с плавающей точкой.

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

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

 Профиль  
                  
 
 Re: циклы (и не только) в ассемблерных вставках
Сообщение19.04.2011, 22:34 


22/12/10
15
гм..ну я растыка.знаю..

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

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

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

 Профиль  
                  
 
 Re: циклы (и не только) в ассемблерных вставках
Сообщение20.04.2011, 16:20 
Заслуженный участник


27/04/09
28128
Для возведения в степень может быть полезна формула $b^a = e^{a\ln b}$ (для возведения в квадрат лучше умножить на себя — быстрее немного будет).

 Профиль  
                  
 
 Re: циклы (и не только) в ассемблерных вставках
Сообщение20.04.2011, 20:20 


21/07/10
555
А зачем Вам ассемблер понадобился?

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

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

 Профиль  
                  
 
 Re: циклы (и не только) в ассемблерных вставках
Сообщение20.04.2011, 22:26 


22/12/10
15
alex1910, мне он в принципе ни к чему..но в универе требуют(((

 Профиль  
                  
 
 Re: циклы (и не только) в ассемблерных вставках
Сообщение29.04.2011, 00:01 
Заслуженный участник


26/07/09
1559
Алматы
2fenek
Скажу вам по-секрету, многие компиляторы могут генерировать промежуточный ассемблерный листинг. Пишите код, компилируете и смотрите, что получилось. Заодно поймете насколько тупы бывают современные компиляторы (в принципе, это то, о чем говорил alex1910).

 Профиль  
                  
 
 Re: циклы (и не только) в ассемблерных вставках
Сообщение03.05.2011, 18:41 


22/12/10
15
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 
Заслуженный участник


27/04/09
28128
Цитата:
Используется синтаксис 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 


22/12/10
15
хм..вроде как нет

 Профиль  
                  
 
 Re: циклы (и не только) в ассемблерных вставках
Сообщение03.05.2011, 20:50 
Заслуженный участник


27/04/09
28128
И вообще, что-то вы там, похоже, химичите. Вам, наверно, нужен натуральный логарифм? А в коде двоичный. Оба раза. Ещё есть подозрения, но я ужасно знаю ассемблер, и оставлю их при себе.

 Профиль  
                  
 
 Re: циклы (и не только) в ассемблерных вставках
Сообщение03.05.2011, 20:52 
Заслуженный участник


04/05/09
4587
В процессорах Интел принято возводить в степень двойку. См. команду F2XM1.
Логарифмируют тоже по основанию 2: FYL2X и FYL2XP1. Заодно можно сразу умножить на нужную константу, типа $\frac 1 {\ln 2}$.

 Профиль  
                  
 
 Re: циклы (и не только) в ассемблерных вставках
Сообщение03.05.2011, 21:03 
Заслуженный участник


27/04/09
28128
Код:
;вычисление ln|x/(1+y)|=ln f   
fld k
fld f
fyl2x
fstp f
В этом куске нет умножения.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group