Forth http://fforum.winglion.ru/ |
|
Скорость исполнения кода http://fforum.winglion.ru/viewtopic.php?f=18&t=3200 |
Страница 1 из 1 |
Автор: | Askalite [ Сб окт 13, 2018 10:50 ] |
Заголовок сообщения: | Скорость исполнения кода |
Я (новичок в программировании FASM и SPF) правильно понимаю, что SPF устроен так, что очень часто использует прыжки с одной части кода в другую (от слова к слову), а потому полностью рушит ускорение исполнения кода с помощью конвейера процессора? И где можно просмотреть SPF_FAQ? |
Автор: | Victor__v [ Сб окт 13, 2018 11:54 ] |
Заголовок сообщения: | Re: Скорость исполнения кода |
Переход от одного слова к другому в СПФ это обычный вызов с помощью CALL (ассемблер). В СПФе всё нативно в этом плане без заморочек. Цитата: а потому полностью рушит ускорение исполнения кода с помощью конвейера процессора? это как? Цитата: Где можно просмотреть SPF_FAQ? \docs\intro.ru.html Ещё в поставке СПФ есть справочник \docs\papers Или спрашивайте тут на форуме. Поможем, чем сможем |
Автор: | Hishnik [ Сб окт 13, 2018 15:48 ] |
Заголовок сообщения: | Re: Скорость исполнения кода |
Askalite писал(а): прыжки с одной части кода в другую (от слова к слову), а потому полностью рушит ускорение исполнения кода с помощью конвейера процессора? Современные процессоры устроены не так просто. Для конвейеризованного процессора действительно важно, чтобы команды выполнялись последовательно, потому что за командой jmp, вошедшей в конвейер, тянутся еще команды, которые будут уже не нужны после перехода. Но если говорить о суперскалярной архитектуре (современные x86), то в них как раз анализируется конвейер, и если туда прочитана команда безусловного перехода, то чтение следующих команд начинается уже с нового адреса. Это неплохо работает даже для условных переходов https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2 |
Автор: | Askalite [ Вт окт 16, 2018 09:28 ] |
Заголовок сообщения: | Re: Скорость исполнения кода |
Victor__v писал(а): :?: Переход от одного слова к другому в СПФ это обычный вызов с помощью CALL (ассемблер). В СПФе всё нативно в этом плане без заморочек. Допустим два слова: А Б Интерпретатор идёт к первому слову А, предварительно в стек возрата адрес слова Б, а потом после выполнения делает jmp по неизвестному месту, из стека аозвратов, что по идее должно сбивать предсказание, но ваши ответы и Hishnik всё мне объяснили, даже больше чем вся документация, что я нарыл по SPF. А теперь к другому: http://spf.sourceforge.net/docs/src.ru.html EAX - вершина стека данных EBP - указатель на стек данных (т.е. [EBP] - второй элемент стека данных) Стек параметров адресуется регистром EBP, вершина стека хранится в EAX Дно: S0 1) Я так понимаю стек параметров и данных одно и тоже? 2) Чем отличается EAX от EBP? 3) [EBP] это указатель на второй элемент или значение второго элемента? Было бы неплохо объяснить и пример этого кода: Код: CODE DUP ( x -- x x ) LEA EBP, -4 [EBP] MOV [EBP], EAX RET END-CODE Особенно непонятен момент с тем, где здесь работа с адресами/указателями, а где со значениями. (Я очень плохо знаю ASM) |
Автор: | Victor__v [ Вт окт 16, 2018 11:41 ] |
Заголовок сообщения: | Re: Скорость исполнения кода |
Начнём с того, что в СПФ при вызове какого-либо слова интерпретатор перестаёт работать. К примеру, Код: : TEST 10 . 20 . 30 . CR ." HELLO WORD" CR ; TEST 1-я строчка: Создаём определение. нас это не интересует. 2-я строчка: Теперь вызываем слово из режима интерпретации. В этом случае INTERPRET находит указатель на начало кода слова TEST и передаёт управление этому слову. Интерпретатор до завершения слова TEST никак не участвует. Цитата: Допустим два слова: А Б В данном случае в режиме интерпретации Сначала выполнится слово A потом управление перейдёт на INTERPRET, а потом на Б и снова на интерпретатор Код: предварительно в стек возрата адрес слова Б, а потом после выполнения делает jmp по неизвестному месту Интересная схема, но замудрённая. В известных мне фортах всё проще. Цитата: 1) Я так понимаю стек параметров и данных одно и тоже? Да, обычно под этим понимается одно и тоже. Цитата: 2) Чем отличается EAX от EBP? 3) [EBP] это указатель на второй элемент или значение второго элемента? Это разные регистры в регистре EAX хранится первый элемент стека данных а в EBP указатель на второй элемент соот-но в 4 [EBP] хранится третий элемент и т. д. По коду DUP Наверно вас смущает инструкция LEA? На мой взгляд самая лучшая инструкция в интеле Она позволяет стабильно за 1 такт (поправьте, если ошибаюсь) загрузить в регистр сумму значений других регистров Код: LEA EBP, -4 [EBP] В данном случае EBP = -4 + EBP |
Автор: | Askalite [ Ср окт 17, 2018 04:58 ] |
Заголовок сообщения: | Re: Скорость исполнения кода |
Victor__v писал(а): Это разные регистры в регистре EAX хранится первый элемент стека данных а в EBP указатель на второй элемент соот-но в 4 [EBP] хранится третий элемент и т. д. 8 7 6 5 4 3 2 1 0 [адреса которые уменьшаются по росту стека] 7 0 1 2 3 4 5 0 r [значения где r — рандом] 7:0— нижний элемент стека 2:5 — верхний элемент Итак: S0 хранит адрес 8 [8] хранит значение 7 EAX хранит значение 5 EBP хранит адрес 3, а [3] имеет значение 4 Что хранит [EBP]? Адрес? Значение? "4 [EBP]" это какое-то отдельное слово где хранится 3 элемент? Victor__v писал(а): Наверно вас смущает инструкция LEA? Код: LEA EBP, -4 [EBP] В данном случае EBP = -4 + EBP Нет, LEA замечательная инструкция, меня смутил "-4 [EBP]", я ожидал увидеть [EBP-4] (изучаю синтаксис fasm). |
Автор: | Victor__v [ Ср окт 17, 2018 14:15 ] |
Заголовок сообщения: | Re: Скорость исполнения кода |
Askalite писал(а): Нет, LEA замечательная инструкция, меня смутил "-4 [EBP]", я ожидал увидеть [EBP-4] (изучаю синтаксис fasm). В ассемблере и дизассемблере СПФа просто такой синтаксис. Вот и всё. Так, теперь по стеку По элементам: 1 EAX 2 [EBP] 3 [EBP+4] 4 [EBP+8] и т. д. Лучше сейчас этим не заморачиваться. Тут как никак всё упирается в указатели. Даже в сях указатели изучаются не сразу. Наберётесь опыта всё станет понятнее. |
Автор: | Askalite [ Пн янв 21, 2019 05:20 ] |
Заголовок сообщения: | Re: Скорость исполнения кода |
Victor__v писал(а): Askalite писал(а): Нет, LEA замечательная инструкция, меня смутил "-4 [EBP]", я ожидал увидеть [EBP-4] (изучаю синтаксис fasm). В ассемблере и дизассемблере СПФа просто такой синтаксис. Вот и всё. Так, теперь по стеку По элементам: 1 EAX 2 [EBP] 3 [EBP+4] 4 [EBP+8] и т. д. Лучше сейчас этим не заморачиваться. Тут как никак всё упирается в указатели. Даже в сях указатели изучаются не сразу. Наберётесь опыта всё станет понятнее. Это всё нисколько мне не разьяснило ничего. Я знаю что такое указатель. Вы только сильнее запутали меня. UPD: Код: CODE DUP ( x -- x x ) LEA EBP, -4 [EBP] MOV [EBP], EAX RET END-CODE Сначала в EBP загружается адрес [EBP]-4 Потом значение EAX копируется в [EBP] EBP - указатель на стек данных (т.е. [EBP] - второй элемент стека данных) То есть положение [EBP] равняется EBP+4 То есть в EBP загружается адрес EBP+4-4 ????? |
Автор: | Victor__v [ Пн янв 21, 2019 09:32 ] |
Заголовок сообщения: | Re: Скорость исполнения кода |
Askalite писал(а): Это всё нисколько мне не разьяснило ничего. Я знаю что такое указатель. Вы только сильнее запутали меня. UPD: Код: CODE DUP ( x -- x x ) LEA EBP, -4 [EBP] MOV [EBP], EAX RET END-CODE Сначала в EBP загружается адрес [EBP]-4 Потом значение EAX копируется в [EBP] EBP - указатель на стек данных (т.е. [EBP] - второй элемент стека данных) То есть положение [EBP] равняется EBP+4 То есть в EBP загружается адрес EBP+4-4 ????? Ладно, ещё раз EBP=EBP+CELL [EBP]=EAX RET "То есть в EBP загружается адрес EBP+4-4" Нет, в него не загружается такой адрес Зайдём с другого. Зачем по вашему в форт-примитавах используется регистр EAX ? |
Автор: | Askalite [ Чт янв 24, 2019 15:32 ] |
Заголовок сообщения: | Re: Скорость исполнения кода |
Victor__v писал(а): Ладно, ещё раз EBP=EBP+CELL [EBP]=EAX RET "То есть в EBP загружается адрес EBP+4-4" Нет, в него не загружается такой адрес Зайдём с другого. Зачем по вашему в форт-примитавах используется регистр EAX ? Я уже успел разобраться во всём самостоятельно. Стек данных форта и стек данных это не одно и тоже! EAX - вершина стека данных форта EBP - вершина стека данных сразу после EAX Правильное описание должно выглядеть так: EAX - вершина стека данных форта EBP - указатель на второй элемент стека данных (т.е. [EBP] - второй элемент стека данных форта) А не как тут: http://spf.sourceforge.net/docs/src.ru.html А я то думал в EBP загружается адрес ячейки [EBP+4-4] Я бы не ломал себе мозг, если бы с самого начала мануал был бы написан правильно. UPD Итак, итоги: В EBP хранится адрес вершины стека данных, указатель на второй элемент стека данных, а первый элемент хранится в EAX. |
Автор: | KPG [ Чт янв 24, 2019 16:48 ] |
Заголовок сообщения: | Re: Скорость исполнения кода |
Askalite писал(а): Я уже успел разобраться во всём самостоятельно. Стек данных форта и стек данных это не одно и тоже! EAX - вершина стека данных форта ... Не стэка Форта, а реализации, например, стека данных в частной Форт системе! В разных Форт системах его реализация может существенно отличаться, но он остаётся стэком данных Форт-системы. Кэширование верхнего элемента стэка в регистре EAX (где то в EBX) один из вариантов, а может не быть кэширования и стэк данных распологаться на аппаратном стэке процессора, а также другие варианты ... Есть ещё и стэк возвратов. |
Автор: | Victor__v [ Чт янв 24, 2019 17:35 ] |
Заголовок сообщения: | Re: Скорость исполнения кода |
just for lulz Askalite писал(а): Стек данных форта и стек данных это не одно и тоже! Я не буду это комментировать |
Автор: | ath [ Сб янв 26, 2019 01:31 ] |
Заголовок сообщения: | Re: Скорость исполнения кода |
Askalite писал(а): Итак, итоги: В EBP хранится адрес вершины стека данных, указатель на второй элемент стека данных, а первый элемент хранится в EAX. Всё так. Верхний элемент стека данных кэширован в EAX. Сейчас я тоже в Каллисто перехожу от простой реализации стека данных «один в один» к кэшированию двух верхних элементов стека в более быстрых операционных регистрах X и Y. По исследованиям Форта, в которых это разбиралось, выгоду даёт хранение в регистрах одного или двух верхних элементов стека. Хранить в быстрой памяти большее число элементов становится уже не так выгодно. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |