+129
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
product:
.LFB34:
.cfi_startproc
xor eax, eax
test esi, esi
je .L7
lea eax, [rsi-1]
mov edi, edi
add rax, 1
imul rax, rdi
.L7:
rep
ret
.cfi_endproc
Оптимизациия умножения через рекурсию. Сишный код:
inline unsigned long int product_0(const unsigned int a, const unsigned int b, const unsigned long int tmp)
{
if (b == 0) return tmp;
return product_0(a, b-1, tmp+a);
}
unsigned long int product(const unsigned int a, const unsigned int b)
{
return product_0(a, b, 0);
}
Распознать умножение (imul) в этой рекурсивной хрени компилятор смог, но при этом как-то через жопу, нагенерировав при этом много лишнего говна.
gcc version 4.5.1
Запостил: j123123,
12 Октября 2013
bormand 12.10.2013 08:47 # +3
> mov edi, edi
> add rax, 1
Что-то ему явно нечем было заняться ;)
Stertor 12.10.2013 09:20 # 0
guest 15.10.2013 19:46 # −2
guest 15.10.2013 19:51 # −1
Если хочешь общения - зарегай учетку, анальные гости здесь не в почете.
anonimb84a2f6fd141 16.10.2013 00:32 # +4
Dummy00001 12.10.2013 19:14 # +3
> нагенерировав при этом много лишнего говна.
кто-то написал на С "лишнего говна."
компилятор не богами писан. он всего лишь компилятор - а не говно-разгребатель. любой оптимизатор можно какой-нибудь глупой херней.
3.14159265 12.10.2013 23:15 # +8
+1
Авторам компилятора зачет только за то, что он додуплил развернуть эту хвостовую срань в одну инструкцию умножения.
bormand 12.10.2013 19:19 # 0
kegdan 12.10.2013 20:13 # −1
1024-- 12.10.2013 20:16 # +1
Lure Of Chaos 12.10.2013 23:47 # +3
j123123 13.10.2013 01:16 # 0
получается
Хотя можно было бы сделать
Stertor 13.10.2013 10:12 # −3
Но откуда они взялись, в коде ведь только esi и edi?
Товарищи, прошу прощенья, что не в тему. А как можно на асме поместить результат в переменную? ;заполнить eax суммой сложения rsi+rdi??
bormand 13.10.2013 10:37 # +3
Stertor 13.10.2013 10:39 # −3
Схему Вашу сохраню, на всякий случай.
bormand 13.10.2013 10:50 # +1
Ну в интелосинтаксисе так:
Stertor 13.10.2013 10:59 # −2
push variable
pop eax (или наоборот, это теперь уже не суть важно). Теперь буду делать так.
Спасибо!
Stertor 13.10.2013 11:09 # −2
:D
Stertor 13.10.2013 12:50 # 0
Клсссно на нем API дергать.
kegdan 13.10.2013 13:38 # +2
Stertor 13.10.2013 13:59 # −1
kegdan 13.10.2013 19:43 # 0
Stertor 14.10.2013 13:01 # 0
kegdan 14.10.2013 13:37 # +1
На мой взгляд Делфи неудобен. Попробуй другие языки. Из того, что я пробовал самый удобный руби.
Stertor 14.10.2013 13:49 # 0
Stertor 14.10.2013 13:58 # −1
не значит, что его нужно учить поверхностно. Халявы в изучении программирования
вообще нет. Ты очевидно имеешь именно поверхностные знания о Delphi,
поэтому судишь так. Между тем я тебя хорошо понимаю, я тоже раньше до
тошноты ненавидел паскальный синтаксис, меня бы никто не заставил
читать исходники. Но когда я ухлопал больше 2 лет на разработку проекта
на удобном и хваленом PureBasic и не получил ожидаемых результатов -
понял, что проиграл и изрядно свалял дурака, связавшись с этим языком и что он непригоден для разработки сколько-нибудь серьезных программ.
Пришлось срочно учить что-то более серьезное. Все остальные компиляторы
(сишный билдер, Autoit,purebasic и тп.) уже давно покрылись пылью, я их
даже не открываю.
kegdan 14.10.2013 14:05 # +1
Кем хваленым?) От него даже MS открестились) Pure C - язык для очень специфичных задач. Например мне он интересен чисто в академическом смысле, не думаю, что буду на нем писать. Плюсы излишне сложны - не то, что бы я не смог их выучить, просто я не вижу смысла убивать на них столько времени.
Stertor 14.10.2013 14:06 # 0
http://purebasic.com/
Ничего не путаешь?
kegdan 14.10.2013 14:22 # +1
Stertor 14.10.2013 14:43 # −2
-Хромой аналог Visual Basic на костялых.
Я тогда пропустил это мимо ушей. Зря, как оказалось.
И вообще, простота, как говорится, хуже гомосексуализма.
kegdan 14.10.2013 15:19 # +1
MS сами отказались от VB. Фактически Бейсик существует в .NET, но на самом деле это тот же шарп с синтаксисом бейсика. А бейсик мертв
Stertor 14.10.2013 19:34 # +1
Какая безвременная смерть. Всего-то сорок с лишним лет...
keep it short and simple!
sincerely yours, cap.
Abbath 14.10.2013 18:07 # 0
j123123 13.10.2013 14:20 # +2
>xor esi,esi
Нет никакого смысла занулять регистры перед тем, как в них записывать какие-нибудь числа
Stertor 13.10.2013 14:30 # 0
А как занести в регистр указатель на строку??
j123123 13.10.2013 14:57 # +4
Подобной фигней я в свое время занимался, когда захотел написать хелловорд на асмовставках под GNU/Linux
https://www.linux.org.ru/forum/development/8780935
Stertor 13.10.2013 15:03 # −4
Stertor 13.10.2013 15:52 # −1
Я скрыл все плюсы и минусы.
От меня теперь не ждите плюсов, буду благдарить на словах.
kegdan 13.10.2013 19:44 # 0
Stertor 13.10.2013 20:06 # +1
kegdan 13.10.2013 20:57 # 0
Stertor 13.10.2013 21:40 # −3
1024-- 13.10.2013 21:42 # 0
Stertor 13.10.2013 21:51 # 0
)
1024-- 13.10.2013 21:59 # +1
bormand 13.10.2013 22:05 # 0
Stertor 13.10.2013 22:10 # 0
Да пребудет с тобой (асм + delphi - kegdan / (1024+1))
bormand 13.10.2013 22:14 # +1
На ноль можно делить. Получится +∞ или -∞ в зависимости от знака ;)
Нельзя делить только 0 на 0.
Stertor 13.10.2013 22:15 # 0
Кегдан, ты не тролль, а просто детонатор флуда. Наказать онально, мой вердикт.
bormand 13.10.2013 22:22 # +1
А вот в полях Галуа, насколько помню, делить на ноль как раз таки нельзя...
1024-- 13.10.2013 22:20 # +1
Используйте питательную смесь NaN.
Смесь NaN. И Ваша программа не падает!
kegdan 14.10.2013 01:31 # 0
anonimb84a2f6fd141 14.10.2013 02:35 # 0
kegdan 14.10.2013 04:03 # 0
anonimb84a2f6fd141 14.10.2013 18:57 # 0
1024-- 13.10.2013 22:26 # +1
P.S. А производители жёстких дисков-то не обманывают нас, когда умножают на 1000.
bormand 13.10.2013 22:31 # +2
При десятибитном байте - да.
LispGovno 15.10.2013 08:46 # +1
Xom94ok 13.10.2013 21:08 # +2
bormand 13.10.2013 15:38 # 0
Ня! ^_^
an0nym 14.10.2013 08:18 # 0
Не поможет.
defecate-plusplus 14.10.2013 08:29 # 0
так сойдет?
j123123 14.10.2013 10:07 # 0
Если оба числа переменные, он еще вставит проверку на ноль, так что неидеально
Psionic 14.10.2013 16:07 # +1
j123123 15.10.2013 08:09 # 0
и скорость
Разницы на своем процессоре Intel Core2 Quad Q9300 я не заметил
bormand 15.10.2013 09:39 # +1
А может быть совет про то, что стоит юзать полные инструкции вместо сокращенных inc, lodsb, jcxz и т.п. уже устарел, и они выполняются с той же скоростью...
P.S. А вот по поводу длины команд есть стопроцентная инфа: мельчить нельзя. Декодеры справляются только с фиксированным числом команд в блоке (что-то вроде 6 команд на 16 байт, и вроде были еще и ограничения на тип этих команд), и если не соблюдать это соотношение, то команды будут декодироваться медленнее из-за простоя декодеров.
LispGovno 15.10.2013 12:08 # 0
Нужно по возможности брать крупные команды?
bormand 15.10.2013 15:44 # 0
Правила про крупные команды я не нашел, наверное моя инфа устарела, или вообще была брехней... Но правил по подстройке кода под декодеры там куча (страница 147 и ниже).
bormand 15.10.2013 15:43 # +2
Чук и ГекINC and DEC
instructions should be replaced with ADD or SUB instructions, because ADD and
SUB overwrite all flags, whereas INC and DEC do not, therefore creating false
dependencies on earlier instructions that set the flags.