Нужен ли асм для программирования на Си

__Alexander
Offline
Зарегистрирован: 24.10.2012

Проверил, ниче не изменилось.

Вот код на сложение двух переменных от cvavr:

А вот от наших всяких иаров и gcc:

И спрашивается, какого хера сначала пихать переменные в память, потом их оттуда считывать и только потом делать сложение, когда в распоряжении 32 регистра. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

__Alexander пишет:

Проверил, ниче не изменилось.

Ну оть.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

__Alexander пишет:

Проверил, ниче не изменилось.

Где? В твоей голове?

__Alexander пишет:

спрашивается, какого хера сначала пихать переменные в память, потом их оттуда считывать и только потом делать сложение, когда в распоряжении 32 регистра. 

А если подумать? Может найдёшь ответ? 

__Alexander
Offline
Зарегистрирован: 24.10.2012

Ворота пишет:

А если подумать? Может найдёшь ответ? 

Я знаю ответ от самих разрабов этих компиляторов, они оставляют рон под свои промежуточные нужды, когда cvavr сначала работает с рон, а потом при нехватке уже лезет в память, что логично, т.к. человек именно так бы эту программу и написал. Не знаю как в winavr, а в иаре в настройках можно его заставить разместить нужную переменную в конкретном регистре.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

__Alexander пишет:

Я знаю ответ от самих разрабов этих компиляторов

Я не знаю, кто такие разрабы, но то, что ты написал - это бред.

А твой пример кода - это как раз демонстрация того, что писали выше: про то, что говнокод - он не от компилятора, а от программиста.

Если совсем не знать языка и писать на нём, как в начале восьмидесятых, то и результат будет как в начале восьмидесятых. А если выключить к чертям всю оптимизацию, то понятно, что оптимизаторы ни хрена не работают.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ворота, держи дискуссию в рамках, не скатывайся в хамство, ты ж не rkit. 

__Alexander
Offline
Зарегистрирован: 24.10.2012

Ворота пишет:

А твой пример кода - это как раз демонстрация того, что писали выше: про то, что говнокод - он не от компилятора, а от программиста.

Какой такой мой пример кода? Код в одну сточку, сложить, мля, два числа x и y, вот и весь код. И на скринах дизасм этого кода от разных компиляторов. 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

__Alexander пишет:

И спрашивается, какого хера сначала пихать переменные в память, потом их оттуда считывать и только потом делать сложение, когда в распоряжении 32 регистра. 

Вот передергивать не надо - Вы объявили переменные и компилятор отвел под них место и,заметьте, не в регистре, а в физической памяти. Он не может угадать, что переменных у Вас менее 32, да и регистры используются совсем не для хранения переменных.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Прошу прощения за излишнюю резкость.

__Alexander пишет:

Какой такой мой пример кода? Код в одну сточку, сложить, мля, два числа x и y, вот и весь код. И на скринах дизасм этого кода от разных компиляторов. 

Ну, не в одну, допустим.

Начнём с того, что там выключен оптимизатор и используется неизвестный компилятор. Здесь форум по ардуино, поэтому давай исходить из того, что компилятор - GCC, а оптимизация Os - как в ардуино из коробки (чтобы на одном языке говорить).

Показать тебе как выглядит твой код в этом компиляторе с этими условиями? Или сам посмотришь? А заодно, как выглядит этот же код, но правильно написанный?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

mykaida пишет:

Он не может угадать, что переменных у Вас менее 32

Компилятору ничего гадать и не надо, перед ним текст программы, тем более, что он многопроходный.  Без оптимизатора компилятор может построить какой угодно топорный код, заложенный в него разрабоччиками, но дальше - как раз работа оптимизатора, по минимизации и оптимизации использования регистров, выкидывании неиспользуемых результатов вычислений и т.д.  Я к тому, что никто, кроме человека, (грамотного человека) не выполнит эту работу лучше чем самый крутой оптимизатор, и, в этом смысле, как я и сказал, за последние 20 лет мало что изменилось. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

короче, не ссорьтесь, не та тема, я пошёл уже закусь готовить и принимать дезинфицирующее.  чего и вам желаю. 

__Alexander
Offline
Зарегистрирован: 24.10.2012

Ворота пишет:

Показать тебе как выглядит твой код в этом компиляторе с этими условиями? Или сам посмотришь? А заодно, как выглядит этот же код, но правильно написанный?

Посмотрел, команда  STS 0x0061,R24 Store direct to data space  как была так и осталась. 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

А по теме могу сказать, что на ассемблере я писал в 3-х случаях - когда экономил батарейку и запускал процессор на 32кГц, когда не было нормального компилятора си и когда надо было поменять страницу экрана, запустив программу с экранной памяти (еще на БК11). И больше - никогда.

Намного важнее, ИМХО, для программиста умение читать даташиты и правильно их понимать. Особенно, если они написаны на китайском :)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

И да, если б Вы видели какую ахинею генерит Дельфи, хоть и с оптимизатором, у вас бы началось перманентное выпадение глаз.  Кста, С++ от Борланда этим тоже грешит. :) 

самый одекватный компилятор, который мне попадался был Zortech C++ еще для  DOS-а, году так в 92-м.  На тот момент я не мог оптимизировать код, который он генерил.  Я у него, можно сказать, учился. :) 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Я не ссорюсь, и уже извинился.

Я действительно готов реально объяснить человеку 

__Alexander пишет:
какого хера сначала пихать переменные в память

объяснить, что если нормально знать язык, то очевидно, что компилятор обязан положить их в память и никакой оптимизатор этого не обойдёт, т.к. их просто нельзя из памяти выбросить.

Заодно могу показать как писать правильно, чтобы в памяти и в коде вообще ничего не осталось - всё нахрен ушло. И ещё интересные примеры оптимизации показать.

Если спросит - объясню. 

А сорвался на хамство, ну извините ещё раз - не люблю, когда люди не зная языка и не понимая как работает компилятор, начинаю свои "приговоры" выносить.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

__Alexander пишет:

Посмотрел, команда  STS 0x0061,R24 Store direct to data space  как была так и осталась. 

Ну, правильно - он не имеет права её выбросить и никогда не выбросит. Ты так написал пример.

Слушай, это занимает много времени. Посмотри мой предыдущий пост. Если тебе надо объяснить что там и как - скажи я объясню. Если не надо (ты от "разрабов" всё знаешь), то давай разбежимся.

ssss
Offline
Зарегистрирован: 01.07.2016

DetSimen пишет:

От квалификации код зависит больше, чем от самого крутого оптимизатора

Ага... ну-ну... )))))))))))

Если так прёт от собственной "квалификации"... то ваш удел АСМ... и ничто другое... ибо любой Си будет не такой... )))))))))))

__Alexander
Offline
Зарегистрирован: 24.10.2012

Ворота пишет:

Ну, правильно - он не имеет права её выбросить и никогда не выбросит. Ты так написал пример.

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

https://www.codevision.be/codevisionavr-c-105/codevisionavrcompiler?zeni...

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ssss пишет:

Если так прёт от собственной "квалификации"

Меня не прёт, я не программист. 

ssss
Offline
Зарегистрирован: 01.07.2016

Ворота пишет:

объяснить, что если нормально знать язык, то очевидно, что компилятор обязан положить их в память и никакой оптимизатор этого не обойдёт, т.к. их просто нельзя из памяти выбросить.

Заодно могу показать как писать правильно, чтобы в памяти и в коде вообще ничего не осталось - всё нахрен ушло. И ещё интересные примеры оптимизации показать.

"Предварительная отимизация есть зло!"(с)... )))))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

__Alexander пишет:

[видно что программа складывает два числа и на этом завершает свою работу и для такой задачи 32 рона куда более

не два числа, а две глобальные переменные. разницу чуешь? 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

__Alexander пишет:

Ага, т.е. те, кто писал CodeVision совсем дибилы, 

Я не знаю, кто "дибил", а кто нет. Я знаю, что так, как у тебя написано - ни один оптимизатор не выбросит работу с памятью. Тот, кто утверждает обратное - просто не знает языка Си (и СИ++ тоже).

Я уже говорил тебе, если тебе интересно узнать, я готов объяснить, если нет - давай разбегаться, а то добром это не кончится.

__Alexander
Offline
Зарегистрирован: 24.10.2012

DetSimen пишет:

не два числа, а две глобальные переменные. разницу чуешь? 

Да хоть локальные )))

__Alexander
Offline
Зарегистрирован: 24.10.2012

Ворота пишет:

 ни один оптимизатор не выбросит работу с памятью.

Ну посмотри первую картинку. Где ты там узрел хоть намек работы с памятью?

ssss
Offline
Зарегистрирован: 01.07.2016

DetSimen пишет:

ssss пишет:

Если так прёт от собственной "квалификации"

Меня не прёт, я не программист. 

Отож...

Пока переменных мало... их ещё как-то можно в голове держать...

Когда проект большой... и переменных очень много... АСМ уже не для среднестатистического мозга... пусть этим Си и занимается... На больших проектах АСМ продувает Си... и по быстродействию... и по размеру кода... Такова жизнь...

ssss
Offline
Зарегистрирован: 01.07.2016

Ворота пишет:

Я не знаю, кто "дибил", а кто нет. Я знаю, что так, как у тебя написано - ни один оптимизатор не выбросит работу с памятью. Тот, кто утверждает обратное - просто не знает языка Си (и СИ++ тоже).

Чего спорить... кодевижен - яркий представитель полувсевдонедо Си... Это факт... и спор тут неуместен...

ssss
Offline
Зарегистрирован: 01.07.2016

__Alexander пишет:

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

Не надо писать... они сами это знают... Никто в здравом уме... а тем более профи... кодевижэн не юзает... это моветон...

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

__Alexander пишет:

Ворота пишет:

 ни один оптимизатор не выбросит работу с памятью.

Ну посмотри первую картинку. Где ты там узрел хоть намек работы с памятью?


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

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

__Alexander пишет:

Ну посмотри первую картинку. Где ты там узрел хоть намек работы с памятью?

Как где, а "х=10;" это что?

Слушай, друг, я тебе в третий и в последний раз говорю (больше повторять не буду), твоё непонимание происходит от незнания языка. Я готов объяснить, если ты скажешь, что готов слушать. Или давай вот прямо сейчас прекратим и разбежимся. Если же будешь продолжать наскакивать - просто включу метод Овечкина.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

wdrakula пишет:
При некоторых настройках их тоже выкинет.
Уж совсем "при некоторых". Это неэквивалентное преобразование - их нельзя выкидывать. Вернее так: в программе недостаточно информации для того, чтобы принять решение можно их выбрасывать или нет. Разве что супероптимизатор запросит дополнительную информацию от юзера через специальные опции или ещё как.

__Alexander
Offline
Зарегистрирован: 24.10.2012

wdrakula пишет:

При некоторых настройках их тоже выкинет

Не выкинет. Класть при старте все переменные в память будут по-любому. Кроме CVAVR, тот начнет раскидывать по ронам, а уж потом совать в память. Эту фишку сегодня вспомнил и решил еще раз убедиться. Первый раз увидел лет семь-восемь назад. А вот не начни я с ассемблера в своей жизни, то может быть и не заметил такую фигню. ))

 

wdrakula пишет:
Ты ж не в боевой системе компилировал, а на каком нибудь сайте, так?

Как это не в боевой, вот: cvavr, iar и avrstudio c gcc, который собственно и в arduino ide.

__Alexander
Offline
Зарегистрирован: 24.10.2012

Ворота пишет:

Как где, а "х=10;" это что?

x=10 раскладывается на команды:

LDI R30, 10 и MOV R4, R30 

всё, R30 и R4 это регистры общего назначения. Работа с ОЗУ (которая дальше в адресном пространстве) ведется командами LD и ST, которых тут и в помине нет. А между рон и озу есть еще регистры портов, для которых свои команды, прикинь.

 

 

ssss
Offline
Зарегистрирован: 01.07.2016

__Alexander пишет:

Не выкинет. Класть при старте все переменные в память будут по-любому.

Тануна... ЖЦЦ... серьёзно??? ))))

Зависит от настроек... прекомпилятор в уме посчитает... и останется только результат... без математики... )))))))

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

__Alexander пишет:

LDI R30, 10 и MOV R4, R30 

Ну, я всё понял. Думал, ты просто не знаешь языка, а ты ещё и не желаешь знать. До свиданья.

ssss
Offline
Зарегистрирован: 01.07.2016

wdrakula пишет:
Описание глобалов это и есть работа с памятью. При некоторых настройках их тоже выкинет.

И не только глобал... а и локальные может выкинуть... ))))

Агрессивная оптимизация... она такая... Ещё и порядок действий... перевернуть может... code reordering называется...

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

ssss пишет:

Зависит от настроек... прекомпилятор в уме посчитает... и останется только результат... без математики... )))))))

Глобальную переменную? 

Блин, на вас что коронавирус так на всех повлиял? Чёта уровень беда зашкалил.

__Alexander
Offline
Зарегистрирован: 24.10.2012

ssss пишет:

Тануна... ЖЦЦ... серьёзно??? ))))

Зависит от настроек... прекомпилятор в уме посчитает... и останется только результат... без математики... )))))))

Правильно, но результат всё равно сохранит в ОЗУ, а не оставит в РОН. Т.е. выполнит лишнюю команду, которая по сути нахер не нужна, программа дальше не работает. 

Вот что делает GCC при -Os

Как видим, в уме то он посчитал, но мало того, что результат сохранил в ОЗУ (1E по адресу 0x60), так не только результат, но и цифру 20 тоже туда засунул (0x14 по адресу 0x61). Спрашивается, нафига эта переменная ему нужна и чем она лучше 10, которую он предпочел не сохранять?

ssss
Offline
Зарегистрирован: 01.07.2016

Ворота пишет:

Глобальную переменную? 

На таких простых примерах ??? Да как два пальца... )))))))))

Всё что не покрыто volatile... на усмотрение оптимизатора... ))))))))

ssss
Offline
Зарегистрирован: 01.07.2016

__Alexander пишет:

ssss пишет:

Тануна... ЖЦЦ... серьёзно??? ))))

Зависит от настроек... прекомпилятор в уме посчитает... и останется только результат... без математики... )))))))

Правильно, но результат всё равно сохранит в ОЗУ, а не оставит в РОН. Т.е. выполнит лишнюю команду, которая по сути нахер не нужна, программа дальше не работает. 

И что это меняет??? Выкинул??? Выкинул... С задачей справился??? Типа справился... )))))))))))))

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

ssss пишет:

Ворота пишет:

Глобальную переменную? 

На таких простых примерах ??? Да как два пальца... )))))))))

Бредите, сударь. Пример в студию!

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

ssss
Offline
Зарегистрирован: 01.07.2016

Ворота пишет:

Бредите, сударь. Пример в студию!

Остыньте... и не позорьтесь...

Пример двумя постами выше... выбросил и не подавился... )))))))

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

ssss пишет:

Пример двумя постами выше... выбросил и не подавился... )))))))

Где? Не вижу! Брехать не мешки ворочать.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

__Alexander пишет:
Спрашивается, нафига эта переменная ему нужна и чем она лучше 10, которую он предпочел не сохранять?
Как нафига? Она же глобальная. Как же он её выбросит?

__Alexander
Offline
Зарегистрирован: 24.10.2012

ЕвгенийП пишет:

Как нафига? Она же глобальная. Как же он её выбросит?

Та с этим разобрались, тут всё логично, одну он отбросил т.к. она перезаписывается и уже того значения принять не сможет. Вопрос про запись в память, тратя еще кучу тактов на чтение и запись. 

Еще раз картинку, если кто не видел.

Пройдемся по строкам:

1. Записали в R16 число 10, окей,

2. Записали в R30 адрес памяти ($60), в который мы сохраним это число. Тут возникает логический вопрос, зачем? Если мы потом в регистр R16 все равно его считаем и  в конечном итоге мы выполняем команду ADD R16, R17, т.к. сложить ячейки памяти озу невозможно, это всё равно должно происходить в ронах, так какого фига их пихать в озу, если значения уже регистрах, бери да добавляй, здесь нет смысла в озу как таковом. В тини12 ваще нет озу физически, тем не менее написано куча программ под этот мк на одних ронах, и что характерно, под этот мк можно писать исключительно на асме, т.к. си будет искать и пытаться записать всю чухню в озу, что совсем не обязательно.

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

__Alexander пишет:

Тут возникает логический вопрос, зачем?

Я перечитал Вашу пикировку с Володькой - Вы его (и меня) троллите или правда не понимаете зачем?

Потому, что это Си - язык такой. И в этом языке глобальную переменную нельзя соптимизировать и выбросить - она обязана иметь своё место в памяти. Иначе в программе может всё сломаться.

Т.е. просто теоретически нельзя убрать - нет никакого способа у компилятора узнать, что она не нужна.

Вот Вы говорите, что мол эта переменная больше ни для чего не нужна, так нафига её вообще в память помещать? А кто Вам сказал, что не нужна? Потому, что Вам известно, что в программе нет другого файла в котором она объявлена как extern и из которого к ней есть доступ. А компилятору откуда про это знать? Он ведь (компилятор) всегда работает с одним файлом и ни о каких других вообще ничего не знает. Ну, выбросите Вы её - а как быть с тем другим файлом, если он вдруг есть?

Более того, даже если её сделать static (недоступной из других файлов), её все равно нельзя лишать памяти Хотя здесь уже вещи более тонкие, не хочу в теорию компиляции особо вдаваться, но поверьте мне - нельзя. В основном это связано с тем, что она уже получила значение ... ладно не полезу, но поверьте - нельзя её выбросить по той же причинам - у компилятора не способа убедиться в эквивалентности такого преобразования.

Зато, если бы Вы сделали её локальной - она бы памяти и не коснулась. Её бы выбросили нафиг, далеко и сразу. Попробуйте - её в коде вообще не будет!

__Alexander пишет:

под этот мк можно писать исключительно на асме, т.к. си будет искать и пытаться записать всю чухню в озу

Ну, правильно - он (Си) не может по-другому, ну вот такой это язык! Надеюсь, я понятно объяснил почему.

Если Вы хотите придумать "Си только для одного файла и без глобальной инициализации" - пожалуйста, там можно будет соптимизировать, но это уже другой язык будет - не Си.

А про компиляторы Вы зря так - "ничего не изменилось" я тут на форуме выкладывал изумительные результаты оптимизации.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Пора и мне в углу постоять. С моими взглядами. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А что не так, дида? 

Ты то это всё знал и без этой темы.

ssss
Offline
Зарегистрирован: 01.07.2016

ЕвгенийП пишет:

Потому, что это Си - язык такой. И в этом языке глобальную переменную нельзя соптимизировать и выбросить - она обязана иметь своё место в памяти. Иначе в программе может всё сломаться.

Хватит уже нести чушь... еще раз... для тех кто плохо слышит... или не знает...

Цитата:

Всё что не покрыто volatile... на усмотрение оптимизатора...

точка...

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Я первый написал, что ничего не поменялось за 20 лет. Человек может соптимизировать лучше любого шаблонного оптимизатора. Ну, если это грамотный человек. Ты пикировку сначала читал?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ssss пишет:

ЕвгенийП пишет:

Потому, что это Си - язык такой. И в этом языке глобальную переменную нельзя соптимизировать и выбросить - она обязана иметь своё место в памяти. Иначе в программе может всё сломаться.

Хватит уже нести чушь... еще раз... для тех кто плохо слышит... или не знает...

Цитата:

Всё что не покрыто volatile... на усмотрение оптимизатора... точка...

А вас тут вапще не стояло, форум не твой.