Автор |
Сообщение |
|
|
Заголовок сообщения: |
Re: Nova Дневник разработчика |
|
|
Victor__v писал(а): Можно ещё OR SP, 15 Да, но тут экономии не будет
[quote="Victor__v"]Можно ещё OR SP, 15[/quote]Да, но тут экономии не будет
|
|
|
|
Добавлено: Чт апр 04, 2024 20:41 |
|
|
|
|
|
Заголовок сообщения: |
Re: Nova Дневник разработчика |
|
|
Total Vacuum писал(а): Ну тогда заодно и or esp,15 вместо or rsp,15, раз уж пошла такая пьянка Вах, экономия 1 байт) Можно ещё OR SP, 15 предложить, тогда)
[quote="Total Vacuum"]Ну тогда заодно и or esp,15 вместо or rsp,15, раз уж пошла такая пьянка[/quote] Вах, экономия 1 байт)
Можно ещё OR SP, 15 предложить, тогда)
|
|
|
|
Добавлено: Чт апр 04, 2024 16:25 |
|
|
|
|
|
Заголовок сообщения: |
Re: Nova Дневник разработчика |
|
|
|
|
|
Добавлено: Чт апр 04, 2024 14:23 |
|
|
|
|
|
Заголовок сообщения: |
Re: Nova Дневник разработчика |
|
|
Ну тогда заодно и or esp,15 вместо or rsp,15, раз уж пошла такая пьянка
Ну тогда заодно и or esp,15 вместо or rsp,15, раз уж пошла такая пьянка
|
|
|
|
Добавлено: Чт апр 04, 2024 14:19 |
|
|
|
|
|
Заголовок сообщения: |
Re: Nova Дневник разработчика |
|
|
Заменил у себя. Спасибо.
Заменил у себя. Спасибо.
|
|
|
|
Добавлено: Чт апр 04, 2024 11:08 |
|
|
|
|
|
Заголовок сообщения: |
Re: Nova Дневник разработчика |
|
|
Victor__v писал(а): В общем на фасме обошёлся двумя макросами перед вызовами:
macro SKIP { MOV RSI, RSP SUB RSP, 15 SAR RSP, 4 SAL RSP, 4 SUB RSP, 32 }
macro OFF { MOV RSP, RSI }
Поскольку эти фрагменты теперь вызываются постоянно, то буду рад, если вы приведёте более быстрый код выравнивания, если вообще что-то есть быстрее сдвигов. macro SKIP { MOV RSI, RSP OR RSP, 15 SUB RSP, 32+15 }
[quote="Victor__v"] В общем на фасме обошёлся двумя макросами перед вызовами:
macro SKIP { MOV RSI, RSP SUB RSP, 15 SAR RSP, 4 SAL RSP, 4 SUB RSP, 32 }
macro OFF { MOV RSP, RSI }
Поскольку эти фрагменты теперь вызываются постоянно, то буду рад, если вы приведёте более быстрый код выравнивания, если вообще что-то есть быстрее сдвигов.[/quote]
macro SKIP { MOV RSI, RSP OR RSP, 15 SUB RSP, 32+15 }
|
|
|
|
Добавлено: Ср апр 03, 2024 17:05 |
|
|
|
|
|
Заголовок сообщения: |
Re: Nova Дневник разработчика |
|
|
Теперь осталось придумать зачем надо переусложнять систему на ровном месте)
Теперь осталось придумать зачем надо переусложнять систему на ровном месте)
|
|
|
|
Добавлено: Ср апр 03, 2024 11:24 |
|
|
|
|
|
Заголовок сообщения: |
Re: Nova Дневник разработчика |
|
|
Victor__v писал(а): Как будут шифроваться реальные адреса тогда? Вы же подразумеваете, как я понял, отделение части ячейки стека под базу и часть под смещение. Предполагается, что форт-программа не сможет оперировать реальными адресами. "Нереальный адрес" это просто число, старшие биты которого - порядковый номер кучи, младшие - смещение от начала кучи. Victor__v писал(а): Моделируем ситуацию: Вот выделили в хипе условный мегабайт, а винда дала куче адрес размером под 7 байт еще и не выровненный. Как его шифровать? Предполагается, что ядро имеет динамический массив указателей на начало кучи (выделенный виндой адрес), индекс в этом массиве и есть порядковый номер кучи, смещение для выделенного адреса нулевое. Чтобы сконвертировать в реальный адрес, отделяем номер кучи от смещения, берём адрес кучи из массива, используя номер кучи в качестве индекса, и добавляем смещение. Это низкоуровневая операция и она недоступна программам на форте, только определённое количество слов ядра, работающих с памятью, должны это делать. Первые элементы массива указателей не обязательно должны быть кучей. Например указатель с индексом ноль может указывать на начало ядра, а с индексом 1 на стек первого (основного) потока, 2 - стек возвратов этого потока. В принципе, можно базу:смещение сделать по 32 бита, тогда проще будет отделять базу от смещения, просто грузить из стека первый или второй dword. А если нужно выделить кучу больше 4Гб то номер кучи нужно выровнять так, чтобы смещение не конфликтовало с номером (т.е. пропустить несколько элементов массива адресов до нужного номера с достаточным количеством младших нулевых бит) и заполнить элементы так, чтобы первый был реальным адресом кучи, второй = адрес+4Гб, третий +8Гб и т.д. Хотя, в этом случае будет невозможно увеличить размер кучи, если последующие элементы массива будут уже заняты. Но, раз уж мы оперируем гигабайтами, то можно резервировать для каждой кучи например по 256 номеров подряд (а это будет куча до 1Тб). Будет полезно хранить в первых ячейках кучи такие параметры как: размер кучи, порядковый номер кучи (т.е. её виртуальный адрес), может что-то ещё.
[quote="Victor__v"]Как будут шифроваться реальные адреса тогда? Вы же подразумеваете, как я понял, отделение части ячейки стека под базу и часть под смещение.[/quote] Предполагается, что форт-программа не сможет оперировать реальными адресами. "Нереальный адрес" это просто число, старшие биты которого - порядковый номер кучи, младшие - смещение от начала кучи.
[quote="Victor__v"]Моделируем ситуацию: Вот выделили в хипе условный мегабайт, а винда дала куче адрес размером под 7 байт еще и не выровненный. Как его шифровать?[/quote] Предполагается, что ядро имеет динамический массив указателей на начало кучи (выделенный виндой адрес), индекс в этом массиве и есть порядковый номер кучи, смещение для выделенного адреса нулевое.
Чтобы сконвертировать в реальный адрес, отделяем номер кучи от смещения, берём адрес кучи из массива, используя номер кучи в качестве индекса, и добавляем смещение. Это низкоуровневая операция и она недоступна программам на форте, только определённое количество слов ядра, работающих с памятью, должны это делать.
Первые элементы массива указателей не обязательно должны быть кучей. Например указатель с индексом ноль может указывать на начало ядра, а с индексом 1 на стек первого (основного) потока, 2 - стек возвратов этого потока.
В принципе, можно базу:смещение сделать по 32 бита, тогда проще будет отделять базу от смещения, просто грузить из стека первый или второй dword. А если нужно выделить кучу больше 4Гб то номер кучи нужно выровнять так, чтобы смещение не конфликтовало с номером (т.е. пропустить несколько элементов массива адресов до нужного номера с достаточным количеством младших нулевых бит) и заполнить элементы так, чтобы первый был реальным адресом кучи, второй = адрес+4Гб, третий +8Гб и т.д.
Хотя, в этом случае будет невозможно увеличить размер кучи, если последующие элементы массива будут уже заняты. Но, раз уж мы оперируем гигабайтами, то можно резервировать для каждой кучи например по 256 номеров подряд (а это будет куча до 1Тб).
Будет полезно хранить в первых ячейках кучи такие параметры как: размер кучи, порядковый номер кучи (т.е. её виртуальный адрес), может что-то ещё.
|
|
|
|
Добавлено: Вт апр 02, 2024 23:10 |
|
|
|
|
|
Заголовок сообщения: |
Re: Nova Дневник разработчика |
|
|
tsdima писал(а): Я имел ввиду, что в стеке будут только адреса вида "база+смещение". Каждый раз перед их использованием, слова @ ! должны конвертировать их в нормальный адрес. И соответственно, например слово-переменная, помещать в стек тоже адрес вида "база+смещение". Арифметические операции над такими адресами (при условии, что база в старших битах 64-битного слова), тоже допустимы. Мы же не складываем адрес+адрес. Вычитать адреса (адрес-адрес) из разных хипов смысла не имеет.
Вообще, не видя кода, сложно давать советы. Где можно посмотреть то, что есть сейчас? Как будут шифроваться реальные адреса тогда? Вы же подразумеваете, как я понял, отделение части ячейки стека под базу и часть под смещение. Моделируем ситуацию: Вот выделили в хипе условный мегабайт, а винда дала куче адрес размером под 7 байт еще и не выровненный. Как его шифровать? Код Новы выложу позже.
[quote="tsdima"]Я имел ввиду, что в стеке будут только адреса вида "база+смещение". Каждый раз перед их использованием, слова @ ! должны конвертировать их в нормальный адрес. И соответственно, например слово-переменная, помещать в стек тоже адрес вида "база+смещение". Арифметические операции над такими адресами (при условии, что база в старших битах 64-битного слова), тоже допустимы. Мы же не складываем адрес+адрес. Вычитать адреса (адрес-адрес) из разных хипов смысла не имеет.
Вообще, не видя кода, сложно давать советы. Где можно посмотреть то, что есть сейчас?[/quote]
Как будут шифроваться реальные адреса тогда? Вы же подразумеваете, как я понял, отделение части ячейки стека под базу и часть под смещение.
Моделируем ситуацию: Вот выделили в хипе условный мегабайт, а винда дала куче адрес размером под 7 байт еще и не выровненный. Как его шифровать?
Код Новы выложу позже.
|
|
|
|
Добавлено: Пт мар 29, 2024 18:10 |
|
|
|
|
|
Заголовок сообщения: |
Re: Nova Дневник разработчика |
|
|
Я имел ввиду, что в стеке будут только адреса вида "база+смещение". Каждый раз перед их использованием, слова @ ! должны конвертировать их в нормальный адрес. И соответственно, например слово-переменная, помещать в стек тоже адрес вида "база+смещение". Арифметические операции над такими адресами (при условии, что база в старших битах 64-битного слова), тоже допустимы. Мы же не складываем адрес+адрес. Вычитать адреса (адрес-адрес) из разных хипов смысла не имеет.
Вообще, не видя кода, сложно давать советы. Где можно посмотреть то, что есть сейчас?
Я имел ввиду, что в стеке будут только адреса вида "база+смещение". Каждый раз перед их использованием, слова @ ! должны конвертировать их в нормальный адрес. И соответственно, например слово-переменная, помещать в стек тоже адрес вида "база+смещение". Арифметические операции над такими адресами (при условии, что база в старших битах 64-битного слова), тоже допустимы. Мы же не складываем адрес+адрес. Вычитать адреса (адрес-адрес) из разных хипов смысла не имеет.
Вообще, не видя кода, сложно давать советы. Где можно посмотреть то, что есть сейчас?
|
|
|
|
Добавлено: Пт мар 29, 2024 15:29 |
|
|
|
|
|
Заголовок сообщения: |
Re: Nova Дневник разработчика |
|
|
Окей, напишите реализацию слов C! C@ @ ! , которые будут работ с базой+смещение, а также одновременно с нормальными адресами. Покажите мастер-класс.
Окей, напишите реализацию слов C! C@ @ ! , которые будут работ с базой+смещение, а также одновременно с нормальными адресами. Покажите мастер-класс.
|
|
|
|
Добавлено: Пт мар 29, 2024 13:27 |
|
|
|
|
|
Заголовок сообщения: |
Re: Nova Дневник разработчика |
|
|
Victor__v писал(а): Как работать с выделенной памятью в хипе? При помощи слов @ ! C@ C! Victor__v писал(а): Как работать с выделенной памятью в стеке? Допустим, что стек это тоже хип. Victor__v писал(а): Как модифицировать уже существующий код? Приобрести достаточно пива для этого марафона. Victor__v писал(а): Как писать компилирующие слова (аля 0x65 c 0x48 c,)? А код тоже располагается в хипе? Для локальных вызовов можно использовать относительный call. А как вызываются слова из другого хипа? Адрес CFA тоже ведь указатель. Victor__v писал(а): Ладно бы Вы предложили для работы связок база+смещение отдельный набор слов, так нет жеж) Предлагаете всё менять. С точки зрения обычного пользователя форта, отдельный набор слов для работы связок база+смещение - это неприемлемо. Поэтому да, всё менять.
[quote="Victor__v"]Как работать с выделенной памятью в хипе?[/quote] При помощи слов @ ! C@ C!
[quote="Victor__v"]Как работать с выделенной памятью в стеке?[/quote] Допустим, что стек это тоже хип.
[quote="Victor__v"]Как модифицировать уже существующий код?[/quote] Приобрести достаточно пива для этого марафона. :)
[quote="Victor__v"]Как писать компилирующие слова (аля 0x65 c 0x48 c,)?[/quote] А код тоже располагается в хипе? Для локальных вызовов можно использовать относительный call. А как вызываются слова из другого хипа? Адрес CFA тоже ведь указатель.
[quote="Victor__v"]Ладно бы Вы предложили для работы связок база+смещение отдельный набор слов, так нет жеж) Предлагаете всё менять.[/quote] С точки зрения обычного пользователя форта, отдельный набор слов для работы связок база+смещение - это неприемлемо. Поэтому да, всё менять. :)
|
|
|
|
Добавлено: Чт мар 28, 2024 19:12 |
|
|
|
|
|
Заголовок сообщения: |
Re: Nova Дневник разработчика |
|
|
tsdima писал(а): Немного усложнится только ядро. Но оно обычно не очень большое, и не все слова работают с памятью. Всё, что написано на форте, останется таким-же простым. Ядро усложнится не немножко, а офигеть как) Работа с памятью вот просто везде. Как работать с выделенной памятью в хипе? Как работать с выделенной памятью в стеке? Как модифицировать уже существующий код? Как писать компилирующие слова (аля 0x65 c 0x48 c,)? Ладно бы Вы предложили для работы связок база+смещение отдельный набор слов, так нет жеж) Предлагаете всё менять.
[quote="tsdima"] Немного усложнится только ядро. Но оно обычно не очень большое, и не все слова работают с памятью. Всё, что написано на форте, останется таким-же простым.[/quote]
Ядро усложнится не немножко, а офигеть как) Работа с памятью вот просто везде. Как работать с выделенной памятью в хипе? Как работать с выделенной памятью в стеке? Как модифицировать уже существующий код? Как писать компилирующие слова (аля 0x65 c 0x48 c,)?
Ладно бы Вы предложили для работы связок база+смещение отдельный набор слов, так нет жеж) Предлагаете всё менять.
|
|
|
|
Добавлено: Чт мар 28, 2024 15:03 |
|
|
|
|
|
Заголовок сообщения: |
Re: Nova Дневник разработчика |
|
|
Victor__v писал(а): И как бы переход на реальные адреса упрощает систему. Немного усложнится только ядро. Но оно обычно не очень большое, и не все слова работают с памятью. Всё, что написано на форте, останется таким-же простым.
[quote="Victor__v"]И как бы переход на реальные адреса упрощает систему.[/quote] Немного усложнится только ядро. Но оно обычно не очень большое, и не все слова работают с памятью. Всё, что написано на форте, останется таким-же простым.
|
|
|
|
Добавлено: Ср мар 27, 2024 18:02 |
|
|
|
|
|
Заголовок сообщения: |
Re: Nova Дневник разработчика |
|
|
Victor__v писал(а): (система 64-битная). Ну 20 бит номер, 44 бита смещение. Лям динамических куч по 16 терабайт. Хватит?
[quote="Victor__v"](система 64-битная).[/quote] Ну 20 бит номер, 44 бита смещение. Лям динамических куч по 16 терабайт. Хватит? :)
|
|
|
|
Добавлено: Ср мар 27, 2024 17:59 |
|
|
|
|