Работа со стеком
-
Я понимаю. Но кроме как боязнью использовать вершину предназначенной для стека области памяти в качестве указателя стека или полным непониманием устройства стека в x86 я не могу объяснить использование указателей стека типа xxxFFFh. Тогда уж лучше xxxFFCh, т.е. на лицо еще и непонимание роли выравнивания при обращениях к памяти.
Об этом собственно и был вопрос - глупость разработчиков или тонкость хитрого интела.
Мне нужно расположить стек конце прикладного адресного пространства .Phantom-84 wrote:Часто приходилось встречать, когда для 16-разрядных сегментов (обычно реального режима) устанавливают вершину стека 0FFFFh, боясь использовать 0. Возможно, использование указателей стека типа xxxFFFh вызвано этим же. Кстати, в моем "упрощенном исполняемом формате" нет поля для явного хранения указателя стека (только размеры). Это позволяет свободно располагать стек первичного прикладного потока в конце прикладного адресного пространства вне зависимости от размера пространства. Стек в "образ" не входит.
Надо ли для этого явно инициализовать esp нулем.?
Какой простой путь это сделать в asm-программе для колибри?
Нынче в Колибри прикладное адресное пространство располагается в нижней части вирт. адресного пространства, так что нулем по-любому esp инициализировать не надо. Вписывать нужное значение esp в заголовок исполняемого файла тоже не вариант. Единственное решение, которое я вижу, - сделать первоначальный прикладной стек пустым (или небольшим), совместив значение esp (в заголовке) с вершиной памяти для приложения (там же), а потом распределить память в конце прикладного пространства (если такое возможно - см. функции распределения памяти) и переустановить esp программно на вершину этой области. Еще нужно уточнить, практикуется ли в Колибри переменный размер прикладного пространства/пространства ядра. Если да, то нужно как-то узнавать вершину прикладного пространства.
Колибри поставил только неделю назад. ОС для меня совершенно новая.
Поэтому много непоняток. Раньше имел опыт ассемблера под DOS.
Сейчас пытаюсь написать для Колибри транслятор программ на Ассемблер
для двух стековой Forth-машины
Мне нужно такое распределение памяти:
Как это реализовать для колибри?
Поэтому много непоняток. Раньше имел опыт ассемблера под DOS.
Сейчас пытаюсь написать для Колибри транслятор программ на Ассемблер
для двух стековой Forth-машины
Мне нужно такое распределение памяти:
Code: Select all
0 2048 4096 8192 10240
|_____________|____________|__________________|___________|
код данные <--^ <--^
ebp esp
Вот именно такое, чтобы 2 кб кода, потом данные, а потом стек? Использовать директиву org.
Но не факт, что все данные кода поместятся в 2 кб.
В Колибри используется плоская модель памяти. Никаких сегментов, приложение может адресовать память с байта номер 0 по байт 0x8FFFFFFF, при условии, что приложение затребует 2 Гб памяти при инициализации, и система столько памяти сможет выделить. Кроме памяти, резервируемой приложением при старте, можно получать еще куски памяти нужного размера через malloc.
Но не факт, что все данные кода поместятся в 2 кб.
В Колибри используется плоская модель памяти. Никаких сегментов, приложение может адресовать память с байта номер 0 по байт 0x8FFFFFFF, при условии, что приложение затребует 2 Гб памяти при инициализации, и система столько памяти сможет выделить. Кроме памяти, резервируемой приложением при старте, можно получать еще куски памяти нужного размера через malloc.
Это не разметка со стеком в конце прикладного адресного пространства, а как раз-таки типичная для Колибри разметка. Делается так:ywaw1 wrote:Мне нужно такое распределение памяти...
Code: Select all
use32
org 0
db "MENUET01"
dd 1
dd start
dd data_end
dd stack_end
dd stack_end
dd 0,0
start:
...
rb 2048-$
code_end:
...
db 4096-$ dup 0
data_end:
; virtual
...
rb 8192-$
bss_end:
...
rb 10240-$
stack_end:
; end virtual
Code: Select all
...
start:
...
code_end:
align 4
...
data_end:
align 4
...
bss_end:
align 4
rb 4000h ; 16 кб под стек
stack_end:
Объясните мне зачем нужно выравнивание. Что оно делает и в чём профит.
Из хаоса в космос
Процессор работает с данными в 32-битном режиме. Соответственно, он читает данные из памяти по 4 байта за 1 обращение к ОЗУ, грубо говоря. Если у тебя данные хранятся вот так:
то чтение sdword в память займет больше времени, чем могло бы. Для этого нужно выравнивание памяти.
Code: Select all
.org 0
sbyte db 10
sdword dw 20,30,40,50
> 0x8FFFFFFF
0x7FFFFFFF тогда уж.
0x7FFFFFFF тогда уж.
Может "оттолкнуться" от существующего варианта Форта для Колибри сделанного с использованием форт-системы SPF4ywaw1 wrote: Сейчас пытаюсь написать для Колибри транслятор программ на Ассемблер
для двух стековой Forth-машины
KolSPForth
P.S. Русский форум по Форт языку
Можно взять готовые наработки
Один из трансляторов Форта в Аsm ForthEC
Mihail также встроил Форт в ядро Колибри Форт в ядре колибри
Who is online
Users browsing this forum: No registered users and 5 guests