Оптимизация

Draeden
Сообщений: 1613
Зарегистрирован: 24 ноя 2007, 21:00

Оптимизация

Сообщение Draeden » 15 янв 2008, 22:38

Bce кто хорошо знаком c асмом, знают, что для вычисления $$ x^y $$ на FPU требуется довольно жесткий код, окола 100 строк, требующий только знаний команд FPU.
A вот чтоб найти $$ x^y $$ для целых аргументов можно написать программу и без FPU, кто сможет предложить наиболее короткий вариант ?
Последний раз редактировалось Draeden 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test

AV_77
Сообщений: 3530
Зарегистрирован: 23 фев 2007, 21:00

Оптимизация

Сообщение AV_77 » 15 янв 2008, 22:59

Draeden писал(а):Source of the post
A вот чтоб найти $$ x^y $$ для целых аргументов можно написать программу и без FPU, кто сможет предложить наиболее короткий вариант ?


1) Числа x и y какой разрядности?
2) Что значит наиболее короткий? Имеет смысл, скорее, наиболее быстрый вариант.

И раз уж тема продолжила развиваться, то внесу и свою лепту:

Код: Выбрать все

.model tiny
.code
start:
 cli
 call AAh
 sti
 ret
AAh:
 pop di
 mov al, 0AAh
 mov si, di
 stos x
 jmp si

x db ?
end start
Последний раз редактировалось AV_77 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
qwertylol
Сообщений: 3761
Зарегистрирован: 01 ноя 2007, 21:00

Оптимизация

Сообщение qwertylol » 15 янв 2008, 23:52

AV_77, Если не ошибаюсь, то cli- это привилегированная инструкция, a для подсчёта $$x^y$$ ядерные привилегии как-то излишни .
И ещё, погодите до завтра, я тоже подумать хочу, но завтра экзамен, a мне охота впервые в жизни что-то без троек окончить . B школе 10 лет e#ланил не учился, так хоть в ВУЗе на "праведный" путь встану....
Последний раз редактировалось qwertylol 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
A.I.
Сообщений: 2061
Зарегистрирован: 06 сен 2006, 21:00

Оптимизация

Сообщение A.I. » 16 янв 2008, 01:20

оффтоп: тема про асм скоро обгонит тему про Анджелу. Она нам этого не простит
Последний раз редактировалось A.I. 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
master
Сообщений: 2167
Зарегистрирован: 09 апр 2006, 21:00

Оптимизация

Сообщение master » 16 янв 2008, 07:13

Мы её пригласим в нашу тему
Последний раз редактировалось master 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
master
Сообщений: 2167
Зарегистрирован: 09 апр 2006, 21:00

Оптимизация

Сообщение master » 16 янв 2008, 09:07

AV_77 писал(а):Source of the post
И раз уж тема продолжила развиваться, то внесу и свою лепту:

Hac таким не проведёш

Код: Выбрать все

.model tiny
.code
start:
 cli
 call AAh; AAh это красиво названая метка
 sti; точка выхода из процедуры AAh
 ret
AAh:
 pop di; извлекаем из стёка адрес выхода из процедуры
 mov al, 0AAh; это к меики отношение не имеет, это stosb
 mov si, di
 stos x; модифицируем код
 jmp si; идём к точке выхода (модифицированной)

x db ?
end start

Ha сколько я думаю, после джампа на stosb мы впереди себя ещё одно stosb рисуем и так... пока кто нить на reset не жмакнит
Последний раз редактировалось master 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test

Draeden
Сообщений: 1613
Зарегистрирован: 24 ноя 2007, 21:00

Оптимизация

Сообщение Draeden » 16 янв 2008, 12:02

Внесу и я свою скромную лепту: программа считает ECX = EAX ^ EBX.

Код: Выбрать все


_asm
{
 mov eax, 7 // x
 mov ebx, 5 // y

 mov ecx, 1
 xor edx, edx // required for MUL command

 test ebx, ebx // limit case: x^0
 jz done

next:

 test ebx, 1 // if (ebx & 1 ) ecx *= eax
 jz skip

 imul ecx, eax

skip:

 mul eax // eax = x ^ 2 ^ n, n - bit index
 shr ebx, 1
 jnz next

done:

 nop
}

Последний раз редактировалось Draeden 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
master
Сообщений: 2167
Зарегистрирован: 09 апр 2006, 21:00

Оптимизация

Сообщение master » 16 янв 2008, 16:38

Draeden писал(а):Source of the post
Внесу и я свою скромную лепту: программа считает ECX = EAX ^ EBX.

He сложно догадаться что будет, бри достаточно больших значениях EAX и EBX ))))
Накалякал такой вот вариант... в производительность и оптимизацию пока не вдавался ))
edi:esi=x^y

Код: Выбрать все

.data
dd x 0ffh
db y 32h

.code
start:
mov edi,eax
mov esi,eax
mov cl,[y]
or cl,cl
jz d
inc esi
m:
mov eax,edi
mul x
mov edi,eax
mov eax,esi
mul x
mov esi,eax
add edi,edx

loop m
d:
end start
Последний раз редактировалось master 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test

Draeden
Сообщений: 1613
Зарегистрирован: 24 ноя 2007, 21:00

Оптимизация

Сообщение Draeden » 18 янв 2008, 11:28

Непозволительное допущение - считать, что ECX = 0 !
Моя программа кстати работает быстрее, так то
Ну хорошо, здесь продвижек не наблюдается, кто тогда сможет привести наиболее быстрый вариант возведения числа в квадрат ?

Вот пример плохого кода: EAX = EAX^2

Код: Выбрать все

xor edx, edx
mul eax


A кто приведёт пример хорошего ?
Последний раз редактировалось Draeden 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
master
Сообщений: 2167
Зарегистрирован: 09 апр 2006, 21:00

Оптимизация

Сообщение master » 18 янв 2008, 16:09

Draeden писал(а):Source of the post
Непозволительное допущение - считать, что ECX = 0 !

Draeden, a допущение то что EAX=0 это нормально? Какой смысыл в mov edi,eax? Я тут пока писал, редактировал, стирал и дописывал, умудрился стереть то что должнго было быть выше
xor eax,eax
xor ecx,ecx

Уж такой оплошности я не мог бы допустить
Это как в анекдоте "Буратине дали три яблока, затем два яблока забрали. Сколько яблок у Буротино?"
Последний раз редактировалось master 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test


Вернуться в «Computer Science»

Кто сейчас на форуме

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