LINUX.ORG.RU

Есть идеи как улучшить?

 


1

2

Всем привет. Вот написал программу, которая переводит десятичное число в двоичное. Мне хотелось бы узнать, можно ли сделать какие нибудь улучшения, или команды написать, которые лучше подойдут?
Вот ссылка на github

Ответ на: комментарий от AlexAT

Ох бред. Есть movs[b/w/d/q].

Причём тут вообще эта инструкция? Если ты о «из памяти в память», то это не то, потому что здесь работа с регистрами выполняется, а без регистров из памяти в память нельзя.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от AlexAT

У процессора же нет двух каналов с памятью, а только один канал. Как он может за команду получить сигнал и отправить его? Никак. Поэтому, проц сначала получить из памяти значение, изменит его, а потом отправит по этому же каналу.

u0atgKIRznY5
() автор топика

В общем, всё куда сложнее, чем кажется. Рекомендую полностью прочитать и понять хотя бы тот документ, на который я выше ссылку выложил. Будет меньше вопросов.

AlexAT
()
Ответ на: комментарий от u0atgKIRznY5

xor edx, edx
mov edx, ebx
shl ebx, 3
shl edx, 1
add ebx, edx

Зачем здесь xor - вообще мало понятно. Далее - зависимая цепочка: mov edx, ebx и shl ebx уже на части процов не распараллелятся, а далее ещё shl edx и зависимая от всего этого счастья add ebx,edx, которые вообще поставят очередь исполнения раком...

AlexAT
()
Ответ на: комментарий от AlexAT

xor -это так во всех учебника, (первые две строчки), описано как регистры обнулять -вроде как по быстрому.

Silerus ★★★★
()
Ответ на: комментарий от SZT

Так точно :) Увы, только на самых современных, на том же Nehalem (все ксеоны до сих пор ходовых E/X серий) всё плохо.

AlexAT
()
Ответ на: комментарий от Silerus

Зачем обнулять регистр, если далее его перезагружаем полностью? Флаги в данном случае тоже трогать излишне.

AlexAT
()
Ответ на: комментарий от AlexAT

я с ассемблером уже как два года необщаюсь никак, а он быстро забывается, почти мгновенно - только помню что так положенно делать - во всех учебниках что я видел всегда так делали. Возможно потому что последующая операция очень часто может быть add а не mov

Silerus ★★★★
()
Ответ на: комментарий от AlexAT

имею от советских учебник очень положительные воспоминания, сейчас пишут хуже

Silerus ★★★★
()
Ответ на: комментарий от AlexAT

В общем, всё куда сложнее, чем кажется. Рекомендую полностью прочитать и понять хотя бы тот документ, на который я выше ссылку выложил. Будет меньше вопросов.

Мне пока хватает книги «Архитектура компьютера». Кстати, книга, ну очень интересная, рекомендую к прочтению.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от AlexAT

... я даже не знаю снова, что на это сказать

Эту тоже придётся потом читать.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от anonymous

С mov reg,0 / xor reg,reg тоже всё не совсем просто... Есть даже посвящённый этому пункт в интеловском гайде, 3.5.1.8.

AlexAT
()

Знаешь, для чего сейчас пишут на ассемблере? Для того, чтобы юзать всякие навороченные фичи специфичного процессора. Вот бери и юзай всякие SSE9999 и прочую фигню. Хотя бы просто перепиши под x86-64. 32 бита сейчас нахрен никому не уперлись.

Unicode4all ★★★★★
()
Ответ на: комментарий от Unicode4all

32 бита сейчас нахрен никому не уперлись.

И чё? Твоё мнение и всего то. А если я на нетбуке захочу использовать? 32 бита самое то, если больше не нужно.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

32 бита самое то

А ещё 640 КБ хватит всем. Пиши под Ricoh 2A03 или MOS 6507 тогда уж, чего уж там.

anonymous
()
Ответ на: комментарий от Unicode4all

Знаешь, для чего сейчас пишут на ассемблере?

Ты мало знаешь. На ассемблере пишут то, чего нельзя написать ни на одном другом языке. Мне нравиться ассемблер. И вот ссылка на реверс инженеров, click. Почитай, узнаешь чем они занимаются.

u0atgKIRznY5
() автор топика

and eax, [bit] ; логическое сравнение с битом

И далее по тексту... на кой чорт если можно просто сложить 0x30 с битом (0 или 1)?

no-such-file ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

Писать на ассемблере не используя современные фичи процессоров это абсурд. Компиляторы C* их используют и уделает все твои потуги (впрочем для этого многого не нужно:)

anonymous
()
Ответ на: комментарий от u0atgKIRznY5

Да. Мало какой программист в силах тягаться с современным компилятором в плане оптимизаций. А вот выбирать правильные алгоритмы и структуры данных пока должен именно программист.

peregrine ★★★★★
()
Ответ на: комментарий от no-such-file

И далее по тексту... на кой чорт если можно просто сложить 0x30 с битом (0 или 1)?

Там сравнивается разрядная позиция. Я не пойму ваш вариант.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

На ассемблере пишут то, чего нельзя написать ни на одном другом языке.

Можно поподробнее. Всё что можно написать на ассемблере можно написать и на высокоуровневых ЯП. Весь вопрос в эффективности.

peregrine ★★★★★
()
Ответ на: комментарий от anonymous

ТС делает это не очень эффективно. В Development была пара-тройка персонажей, у которых это получалось лучше.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

По уровню упоротости ТС даст прикурить этой тройке персонажей.

anonymous
()
Ответ на: комментарий от peregrine

Чтобы улучшать компилятор нужно понимать что это можно улучшить :)

Вообще систему команд целевого процессора просто нужно знать. Чтобы понимать что умеют конкретные SIMD, чтобы понимать как писать быстрый C/C++ код.

А не думать что компилятор это бог и спускаться на уровень команд не нужно никогда.

Тогда просто не поймёшь чем этот код

return (f - 32.0) * (5.0/9.0);
лучше вот этого
return (f - 32.0) * 5.0/9.0;
или чем этот цикл
	for (int i = 0; i < n; ++i)
	{
		x_min_temp = (x[i] < x_min_temp) ? x[i] : x_min_temp;
		x_max_temp = (x[i] > x_max_temp) ? x[i] : x_max_temp;
	}
лучше вот этого:
	for (int i = 0; i < n; ++i)
	{
		if (x[i] < x_min_temp)
		{
			x_min_temp = x[i];
		}
		else if (x[i] > x_max_temp)
		{
			x_max_temp = x[i];
		}
	}

fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

А тут всё от компилятора зависит. У Clang-а может быть один код лучше, а у GCC - другой. Да и выигрыши ничтожны в большинстве случаев. Т.е. оптимизировать надо тормозящие места и те которые очень много используются (там да, иногда и есть смысл спускаться до ассемблера), а не всё подряд ради выигрыша в пару тактов.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от peregrine

Можно поподробнее.

Да даже ссылка выше на реверс инженеров, они там пишут то, чего не сделать на языках высокого уровня ( или у вас другое мнение? ). Ну или например вызывать прерывания, как bios так и прерывания операционной системы. Обратная разработка. Да и вообще, на ассемблере можно сделать всё, что делают на других языках, а на других языках нельзя сделать всё, что можно сделать на ассемблере. Да даже вот пример, я добавлял системный вызов в ядро линукс. На си я не мог обратиться к системному вызову, а на ассемблере смог.

u0atgKIRznY5
() автор топика

можно ли сделать какие нибудь улучшения

Можно. Перепиши на портабельном ассемблере (aka C).

beastie ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

На других языках, как минимум, можно написать ассемблер. В конце концов любой бинарик (да и вообще любой файл) - набор единичек и ноликов. С единичками и ноликами вполне можно работать на любом ЯП.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

На других языках, как минимум, можно написать ассемблер. В конце концов любой бинарик (да и вообще любой файл) - набор единичек и ноликов. С единичками и ноликами вполне можно работать на любом ЯП.

DOS работал в реальном режиме и чтобы переключаться в графический режим, использовали функции bios для переключения в графический режим. Например в windows можно писать оконные приложения используя winapi на ассемблере, чего нельзя сказать про линукс. В линуксе графическая среда идёт отдельной программой, из-за чего есть задержки при переключении в режим ядра. Но из-за того что в линукс немного по сравнению с windows, системных вызовов, её считают не такой громоздкой. Так как в windows есть системные вызовы по работе с графикой, то работа с графикой выполняется быстрее чем в линукс. И в windows тысячи системных вызовов, по сравнению с линукс, в линукс наверное где-то 400+.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

До тебя пока не дошло, что программа cp скопирует без вопросов любую собранную программу на ассемблере, хотя сама программа cp может быть написана на любом ЯП?

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

До тебя пока не дошло, что программа cp скопирует без вопросов любую собранную программу на ассемблере, хотя сама программа cp может быть написана на любом ЯП?

Ну ты считаешь, что можно сделать на языках высокого уровня то, что делают реверс инженеры в ссылке выше? Они же там пишут. Такого нельзя сделать на языках высокого уровня.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от peregrine

что программа cp скопирует без вопросов любую собранную программу на ассемблере

скопировать код, но не написать такое на языке высокого уровня.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Открою самую страшную тайну - ты можешь работать с машинным кодом напрямую на языках высокого уровня. Ассемблер лишь прослойка, которая более-менее удобна для этого.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Открою самую страшную тайну - ты можешь работать с машинным кодом напрямую на языках высокого уровня. Ассемблер лишь прослойка, которая более-менее удобна для этого.

Да, например в си, ассемблерная вставка называется.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Такого нельзя сделать на языках высокого уровня.

А через несколько лет ты вспомнишь это и осознаешь, что на самом деле можно, но не стоит. И будешь начинающим говорить, что так сделать нельзя.

i-rinat ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

ассемблерная вставка называется.

Можно без ассемблерных вставок сделать. Просто набиваешь память машинным кодом, который потом выполняешь.

i-rinat ★★★★★
()
Ответ на: комментарий от peregrine

Я это знал, только когда писал не подумал об этом. А так как я не подумал об этом, то забыл написать. Но это будет на языке ассемблера писаться, потому что, ты знаешь почему.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от i-rinat

А через несколько лет ты вспомнишь это и осознаешь, что на самом деле можно, но не стоит.

А ты знаешь как это сделать на языке высокого уровня?

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Да, конечно. Берёшь и собираешь программу в памяти. В PCRE3, например, в JIT-компиляторе ассемблерные вставки используются только для вызова cpuid. В самом компиляторе код собирается «вручную».

i-rinat ★★★★★
()

Мне кажется или это anonimous? Похож на тупого тролля еще.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.