|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
27.06.2021, 13:58 | #1 |
Форумчанин
Регистрация: 10.02.2021
Сообщений: 627
|
Несколько вопросов по asm
В целях оптимизации кода, начал изучать основы, как применять ассемблер в Delphi
И возник ряд вопросов 1. На сколько я понимаю, функции inc и dec - пусть и работают быстрее, чем i:=i+1 но все равно происходит вызов функции, создание ссылки на переменную? Потому вопрос: Код:
1.1. Собственно, в продолжении: Если нужно a:=a+b, будет ли лучше сделать так? Код:
Код:
2.2. Будет ли работать такой код, или нет? Будет ли он равнозначен a:=a*b Если нет, то как правильно? Код:
|
27.06.2021, 14:14 | #2 | |||
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Цитата:
Цитата:
Цитата:
Откройте учебник по ассемблеру и посмотрите куда скалываются результат умножения. А результат функции содержится или кладется в регистр eax для integer. А подробнее нужо за зубрить соглашения о вызовах функций. Не будет. Тоже самое что с add.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
|||
27.06.2021, 14:51 | #3 |
Форумчанин
Регистрация: 10.02.2021
Сообщений: 627
|
Тогда снова сюда вопрос:
Код:
2. По какому принципу imul ebx понял, какие переменные ему перемножить? Последние два введенные в регистр? Регистры от первого (eax) до ebx ? Регистр ebx и регистр перед ним? 3. Вопрос по самим регистрам: то есть в принципе, их можно свободно использовать как быстро работающие переменные? На участке кода, который не вызывает других процедур/функций |
27.06.2021, 17:56 | #4 | |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,306
|
Про inc. Код:
Код:
Код:
Цитата:
Эта информация закодирована в мнемонике инструкции. Количество и размер операндов определяют, где будет располагаться результат умножения (https://c9x.me/x86/html/file_module_x86_id_138.html). А вы уверены, что напишите более эффективный ассемблерный код, чем компилятор? Языки высокого уровня придумали, чтобы абстрагироваться от ассемблера. Чтобы код было легче писать, читать и портировать под разные архитектуры. Компилятор не дураки писали. Так что ассемблерный код получается чуть-чуть менее эффективный, чем самописный (а эффективный ассемблерный код еще надо суметь написать). Лезть в ассемблерный код стоит, если видно, что компилятор что-то реализовал плоховато, если флаги компиляции не помогают задействовать какие-то полезные асм-инструкции.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
|
|
27.06.2021, 18:32 | #5 |
Форумчанин
Регистрация: 10.02.2021
Сообщений: 627
|
Вот какие мысли у меня появились после прочтений нескольких статей про ассемблер в Delphi
Хотелось бы услышать мнение профи на счет того, где я прав, а где нет 1. Как я понимаю, в случае цикла for, счетчик хранится в оперативке, а в ассемблере можно один из регистров использовать как счетчик. Что, как я понял, ускорит работу? 2. Снова, for может иметь шаг только 1, или -1, а иногда может быть нужен шаг другой величины 3. На счет циклов. На сколько я понял, любой цикл на "низком уровне" является переходом к метке в случае выполнения/не выполнения условия выхода? На практике иногда нужен цикл с центральным условием Начало цикла Выполнить часть цикла Проверить условие выхода Выполнить остаток цикла Перейти к началу цикла 4. На деле, есть довольно много мест в программе, которые кажутся не эффективными. От чего напрашивается вывод, что может быть, можно создать более эффективный код на ассемблере Например, недавно в одной из тем обсуждался поворот изображения на 90 градусов. И целая куча возни с присвоением указателей для scanline. Может быть, если разобраться в ассемблере, можно ощутимо ускорить этот процесс |
27.06.2021, 18:56 | #6 |
ПШП
Участник клуба
Регистрация: 15.07.2013
Сообщений: 1,876
|
|
27.06.2021, 19:24 | #7 | |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,306
|
Компилятор и так постарается использовать только регистры, если их хватит. Как видно, счетчик i лег на регистр eax.
Код:
Код:
Цитата:
Код:
Код:
Так и напишите бесконечный while: Код:
Может быть, дерзайте
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
|
|
27.06.2021, 19:27 | #8 | ||||
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Цитата:
2021-06-27_19-09-23.png Цитата:
Вам нужно выучить соглашения о вызове функций. http://docwiki.embarcadero.com/RADSt...ter_Convention Это самое трудное в ассемблере. Дальше будет проще. Цитата:
Это тоже надо понять и запомнить, но это не так сложно. Цитата:
Код:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
||||
27.06.2021, 19:32 | #9 |
Форумчанин
Регистрация: 10.02.2021
Сообщений: 627
|
Вот пример кода
Код:
По идее, через ассемблер, можно как-то напрямую обращаться к каждому пикселю, без указателей? Ну и счетчики циклов держать в регистрах, а не в оперативке |
27.06.2021, 19:49 | #10 |
ПШП
Участник клуба
Регистрация: 15.07.2013
Сообщений: 1,876
|
Вы путаете ассемблер с волшебной палочкой.
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Несколько вопросов | Rost93 | PHP | 18 | 19.09.2012 19:38 |
Несколько вопросов | shrek1993 | Visual C++ | 3 | 05.08.2012 18:53 |
несколько вопросов по C | Horus92 | Общие вопросы C/C++ | 2 | 15.11.2009 16:08 |
несколько вопросов | fitc | Общие вопросы Delphi | 28 | 14.07.2009 21:20 |
Несколько Вопросов | Дорст | Общие вопросы Delphi | 3 | 12.11.2007 09:18 |