Автор |
Сообщение |
|
|
Заголовок сообщения: |
Re: Скорость исполнения кода |
|
|
Askalite писал(а): Итак, итоги: В EBP хранится адрес вершины стека данных, указатель на второй элемент стека данных, а первый элемент хранится в EAX. Всё так. Верхний элемент стека данных кэширован в EAX. Сейчас я тоже в Каллисто перехожу от простой реализации стека данных «один в один» к кэшированию двух верхних элементов стека в более быстрых операционных регистрах X и Y. По исследованиям Форта, в которых это разбиралось, выгоду даёт хранение в регистрах одного или двух верхних элементов стека. Хранить в быстрой памяти большее число элементов становится уже не так выгодно.
[quote="Askalite"] Итак, итоги: В EBP хранится адрес вершины стека данных, указатель на второй элемент стека данных, а первый элемент хранится в EAX.[/quote] Всё так. Верхний элемент стека данных кэширован в EAX.
Сейчас я тоже в Каллисто перехожу от простой реализации стека данных «один в один» к кэшированию двух верхних элементов стека в более быстрых операционных регистрах X и Y.
По исследованиям Форта, в которых это разбиралось, выгоду даёт хранение в регистрах одного или двух верхних элементов стека. Хранить в быстрой памяти большее число элементов становится уже не так выгодно.
|
|
|
|
Добавлено: Сб янв 26, 2019 01:31 |
|
|
|
|
|
Заголовок сообщения: |
Re: Скорость исполнения кода |
|
|
just for lulz Askalite писал(а): Стек данных форта и стек данных это не одно и тоже!
Я не буду это комментировать
just for lulz [quote="Askalite"] Стек данных форта и стек данных это не одно и тоже! [/quote] Я не буду это комментировать :D
|
|
|
|
Добавлено: Чт янв 24, 2019 17:35 |
|
|
|
|
|
Заголовок сообщения: |
Re: Скорость исполнения кода |
|
|
Askalite писал(а): Я уже успел разобраться во всём самостоятельно.
Стек данных форта и стек данных это не одно и тоже! EAX - вершина стека данных форта ... Не стэка Форта, а реализации, например, стека данных в частной Форт системе! В разных Форт системах его реализация может существенно отличаться, но он остаётся стэком данных Форт-системы. Кэширование верхнего элемента стэка в регистре EAX (где то в EBX) один из вариантов, а может не быть кэширования и стэк данных распологаться на аппаратном стэке процессора, а также другие варианты ... Есть ещё и стэк возвратов.
[quote="Askalite"] Я уже успел разобраться во всём самостоятельно.
Стек данных форта и стек данных это не одно и тоже! EAX - вершина стека данных форта ...[/quote] Не стэка Форта, а реализации, например, стека данных в частной Форт системе! В разных Форт системах его реализация может существенно отличаться, но он остаётся стэком данных Форт-системы. Кэширование верхнего элемента стэка в регистре EAX (где то в EBX) один из вариантов, а может не быть кэширования и стэк данных распологаться на аппаратном стэке процессора, а также другие варианты ... Есть ещё и стэк возвратов.
|
|
|
|
Добавлено: Чт янв 24, 2019 16:48 |
|
|
|
|
|
Заголовок сообщения: |
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.
[quote="Victor__v"]
Ладно, ещё раз EBP=EBP+CELL [EBP]=EAX RET
"То есть в EBP загружается адрес EBP+4-4" Нет, в него не загружается такой адрес
Зайдём с другого. Зачем по вашему в форт-примитавах используется регистр EAX ?[/quote]
Я уже успел разобраться во всём самостоятельно.
Стек данных форта и стек данных это не одно и тоже!
EAX - вершина стека данных форта
EBP - вершина стека данных сразу после EAX
Правильное описание должно выглядеть так:
EAX - вершина стека данных форта EBP - указатель на второй элемент стека данных (т.е. [EBP] - второй элемент стека данных форта)
А не как тут: http://spf.sourceforge.net/docs/src.ru.html
А я то думал в EBP загружается адрес ячейки [EBP+4-4]
Я бы не ломал себе мозг, если бы с самого начала мануал был бы написан правильно.
UPD
Итак, итоги: В EBP хранится адрес вершины стека данных, указатель на второй элемент стека данных, а первый элемент хранится в EAX.
|
|
|
|
Добавлено: Чт янв 24, 2019 15: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 ?
[quote="Askalite"]
Это всё нисколько мне не разьяснило ничего. Я знаю что такое указатель. Вы только сильнее запутали меня.
UPD:
[code] CODE DUP ( x -- x x ) LEA EBP, -4 [EBP] MOV [EBP], EAX RET END-CODE [/code]
Сначала в EBP загружается адрес [EBP]-4 Потом значение EAX копируется в [EBP]
EBP - указатель на стек данных (т.е. [EBP] - второй элемент стека данных)
То есть положение [EBP] равняется EBP+4
То есть в EBP загружается адрес EBP+4-4
?????[/quote]
Ладно, ещё раз EBP=EBP+CELL [EBP]=EAX RET
"То есть в EBP загружается адрес EBP+4-4" Нет, в него не загружается такой адрес
Зайдём с другого. Зачем по вашему в форт-примитавах используется регистр EAX ?
|
|
|
|
Добавлено: Пн янв 21, 2019 09:32 |
|
|
|
|
|
Заголовок сообщения: |
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 ?????
[quote="Victor__v"][quote="Askalite"]Нет, LEA замечательная инструкция, меня смутил "-4 [EBP]", я ожидал увидеть [EBP-4] (изучаю синтаксис fasm).[/quote]
В ассемблере и дизассемблере СПФа просто такой синтаксис. Вот и всё.
Так, теперь по стеку По элементам: 1 EAX 2 [EBP] 3 [EBP+4] 4 [EBP+8] и т. д.
Лучше сейчас этим не заморачиваться. Тут как никак всё упирается в указатели. Даже в сях указатели изучаются не сразу.
Наберётесь опыта всё станет понятнее.[/quote]
Это всё нисколько мне не разьяснило ничего. Я знаю что такое указатель. Вы только сильнее запутали меня.
UPD:
[code] CODE DUP ( x -- x x ) LEA EBP, -4 [EBP] MOV [EBP], EAX RET END-CODE [/code]
Сначала в EBP загружается адрес [EBP]-4 Потом значение EAX копируется в [EBP]
EBP - указатель на стек данных (т.е. [EBP] - второй элемент стека данных)
То есть положение [EBP] равняется EBP+4
То есть в EBP загружается адрес EBP+4-4
?????
|
|
|
|
Добавлено: Пн янв 21, 2019 05:20 |
|
|
|
|
|
Заголовок сообщения: |
Re: Скорость исполнения кода |
|
|
Askalite писал(а): Нет, LEA замечательная инструкция, меня смутил "-4 [EBP]", я ожидал увидеть [EBP-4] (изучаю синтаксис fasm). В ассемблере и дизассемблере СПФа просто такой синтаксис. Вот и всё. Так, теперь по стеку По элементам: 1 EAX 2 [EBP] 3 [EBP+4] 4 [EBP+8] и т. д. Лучше сейчас этим не заморачиваться. Тут как никак всё упирается в указатели. Даже в сях указатели изучаются не сразу. Наберётесь опыта всё станет понятнее.
[quote="Askalite"]Нет, LEA замечательная инструкция, меня смутил "-4 [EBP]", я ожидал увидеть [EBP-4] (изучаю синтаксис fasm).[/quote]
В ассемблере и дизассемблере СПФа просто такой синтаксис. Вот и всё.
Так, теперь по стеку По элементам: 1 EAX 2 [EBP] 3 [EBP+4] 4 [EBP+8] и т. д.
Лучше сейчас этим не заморачиваться. Тут как никак всё упирается в указатели. Даже в сях указатели изучаются не сразу.
Наберётесь опыта всё станет понятнее.
|
|
|
|
Добавлено: Ср окт 17, 2018 14:15 |
|
|
|
|
|
Заголовок сообщения: |
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).
[quote="Victor__v"] Это разные регистры :D в регистре EAX хранится первый элемент стека данных а в EBP указатель на второй элемент соот-но в 4 [EBP] хранится третий элемент и т. д. [/quote]
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 элемент?
[quote="Victor__v"] Наверно вас смущает инструкция LEA?
[code] LEA EBP, -4 [EBP][/code] В данном случае EBP = -4 + EBP[/quote]
Нет, LEA замечательная инструкция, меня смутил "-4 [EBP]", я ожидал увидеть [EBP-4] (изучаю синтаксис fasm).
|
|
|
|
Добавлено: Ср окт 17, 2018 04:58 |
|
|
|
|
|
Заголовок сообщения: |
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
Начнём с того, что в СПФ при вызове какого-либо слова интерпретатор перестаёт работать. К примеру, [code]: TEST 10 . 20 . 30 . CR ." HELLO WORD" CR ; TEST[/code] 1-я строчка: Создаём определение. нас это не интересует. 2-я строчка: Теперь вызываем слово из режима интерпретации. В этом случае INTERPRET находит указатель на начало кода слова TEST и передаёт управление этому слову. Интерпретатор до завершения слова TEST [b]никак не участвует[/b].
[quote] Допустим два слова:
А Б [/quote] В данном случае [b]в режиме интерпретации [/b] Сначала выполнится слово A потом управление перейдёт на INTERPRET, а потом на Б и снова на интерпретатор
[code]предварительно в стек возрата адрес слова Б, а потом после выполнения делает jmp по неизвестному месту[/code] Интересная схема, но замудрённая. В известных мне фортах всё проще.
[quote]1) Я так понимаю стек параметров и данных одно и тоже?[/quote] Да, обычно под этим понимается одно и тоже.
[quote]2) Чем отличается EAX от EBP? 3) [EBP] это указатель на второй элемент или значение второго элемента? [/quote] Это разные регистры :D в регистре EAX хранится первый элемент стека данных а в EBP указатель на второй элемент соот-но в 4 [EBP] хранится третий элемент и т. д.
По коду DUP Наверно вас смущает инструкция LEA? На мой взгляд самая лучшая инструкция в интеле Она позволяет стабильно за 1 такт (поправьте, если ошибаюсь) загрузить в регистр сумму значений других регистров
[code] LEA EBP, -4 [EBP][/code] В данном случае EBP = -4 + EBP
|
|
|
|
Добавлено: Вт окт 16, 2018 11:41 |
|
|
|
|
|
Заголовок сообщения: |
Re: Скорость исполнения кода |
|
|
Victor__v писал(а): :?: Переход от одного слова к другому в СПФ это обычный вызов с помощью CALL (ассемблер). В СПФе всё нативно в этом плане без заморочек. Допустим два слова: А Б Интерпретатор идёт к первому слову А, предварительно в стек возрата адрес слова Б, а потом после выполнения делает jmp по неизвестному месту, из стека аозвратов, что по идее должно сбивать предсказание, но ваши ответы и Hishnik всё мне объяснили, даже больше чем вся документация, что я нарыл по SPF. А теперь к другому: http://spf.sourceforge.net/docs/src.ru.htmlEAX - вершина стека данных 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)
[quote="Victor__v"]:?: Переход от одного слова к другому в СПФ это обычный вызов с помощью CALL (ассемблер). В СПФе всё нативно в этом плане без заморочек.[/quote]
Допустим два слова:
А Б
Интерпретатор идёт к первому слову А, предварительно в стек возрата адрес слова Б, а потом после выполнения делает jmp по неизвестному месту, из стека аозвратов, что по идее должно сбивать предсказание, но ваши ответы и [b]Hishnik[/b] всё мне объяснили, даже больше чем вся документация, что я нарыл по SPF. А теперь к другому:
http://spf.sourceforge.net/docs/src.ru.html
EAX - вершина стека данных EBP - указатель на стек данных (т.е. [EBP] - второй элемент стека данных) Стек параметров адресуется регистром EBP, вершина стека хранится в EAX Дно: S0
1) Я так понимаю стек параметров и данных одно и тоже? 2) Чем отличается EAX от EBP? 3) [EBP] это указатель на второй элемент или значение второго элемента?
Было бы неплохо объяснить и пример этого кода: [code] CODE DUP ( x -- x x ) LEA EBP, -4 [EBP] MOV [EBP], EAX RET END-CODE [/code]
Особенно непонятен момент с тем, где здесь работа с адресами/указателями, а где со значениями. (Я очень плохо знаю ASM)
|
|
|
|
Добавлено: Вт окт 16, 2018 09:28 |
|
|
|
|
|
Заголовок сообщения: |
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
[quote="Askalite"]прыжки с одной части кода в другую (от слова к слову), а потому полностью рушит ускорение исполнения кода с помощью конвейера процессора?[/quote] Современные процессоры устроены не так просто. Для конвейеризованного процессора действительно важно, чтобы команды выполнялись последовательно, потому что за командой jmp, вошедшей в конвейер, тянутся еще команды, которые будут уже не нужны после перехода. Но если говорить о суперскалярной архитектуре (современные x86), то в них как раз анализируется конвейер, и если туда прочитана команда безусловного перехода, то чтение следующих команд начинается уже с нового адреса. Это неплохо работает даже для условных переходов [url]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[/url]
|
|
|
|
Добавлено: Сб окт 13, 2018 15:48 |
|
|
|
|
|
Заголовок сообщения: |
Re: Скорость исполнения кода |
|
|
Переход от одного слова к другому в СПФ это обычный вызов с помощью CALL (ассемблер). В СПФе всё нативно в этом плане без заморочек. Цитата: а потому полностью рушит ускорение исполнения кода с помощью конвейера процессора? это как? Цитата: Где можно просмотреть SPF_FAQ? \docs\intro.ru.html Ещё в поставке СПФ есть справочник \docs\papers Или спрашивайте тут на форуме. Поможем, чем сможем
:?: Переход от одного слова к другому в СПФ это обычный вызов с помощью CALL (ассемблер). В СПФе всё нативно в этом плане без заморочек.
[quote]а потому полностью рушит ускорение исполнения кода с помощью конвейера процессора?[/quote] это как?
[quote]Где можно просмотреть SPF_FAQ?[/quote] \docs\intro.ru.html
Ещё в поставке СПФ есть справочник \docs\papers
Или спрашивайте тут на форуме. Поможем, чем сможем
|
|
|
|
Добавлено: Сб окт 13, 2018 11:54 |
|
|
|
|
|
Заголовок сообщения: |
Скорость исполнения кода |
|
|
Я (новичок в программировании FASM и SPF) правильно понимаю, что SPF устроен так, что очень часто использует прыжки с одной части кода в другую (от слова к слову), а потому полностью рушит ускорение исполнения кода с помощью конвейера процессора? И где можно просмотреть SPF_FAQ?
Я (новичок в программировании FASM и SPF) правильно понимаю, что SPF устроен так, что очень часто использует прыжки с одной части кода в другую (от слова к слову), а потому полностью рушит ускорение исполнения кода с помощью конвейера процессора? И где можно просмотреть SPF_FAQ?
|
|
|
|
Добавлено: Сб окт 13, 2018 10:50 |
|
|
|
|