Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Чт апр 27, 2017 10:16 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 26 сообщений ]  На страницу Пред. 1 2
Автор Сообщение
 Заголовок сообщения: Re: Работа со стеком
СообщениеДобавлено: Вт сен 20, 2011 9:54 pm 
Не в сети

Зарегистрирован: Вс фев 18, 2007 8:34 pm
Сообщения: 158
Я понимаю. Но кроме как боязнью использовать вершину предназначенной для стека области памяти в качестве указателя стека или полным непониманием устройства стека в x86 я не могу объяснить использование указателей стека типа xxxFFFh. Тогда уж лучше xxxFFCh, т.е. на лицо еще и непонимание роли выравнивания при обращениях к памяти.


Вернуться к началу
 Заголовок сообщения: Re: Работа со стеком
СообщениеДобавлено: Вт сен 20, 2011 10:05 pm 
Об этом собственно и был вопрос - глупость разработчиков или тонкость хитрого интела.


Вернуться к началу
   
 Заголовок сообщения: Re: Работа со стеком
СообщениеДобавлено: Пн июн 25, 2012 8:50 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Вт июн 19, 2012 7:04 am
Сообщения: 16
Phantom-84 писал(а):
Часто приходилось встречать, когда для 16-разрядных сегментов (обычно реального режима) устанавливают вершину стека 0FFFFh, боясь использовать 0. Возможно, использование указателей стека типа xxxFFFh вызвано этим же. Кстати, в моем "упрощенном исполняемом формате" нет поля для явного хранения указателя стека (только размеры). Это позволяет свободно располагать стек первичного прикладного потока в конце прикладного адресного пространства вне зависимости от размера пространства. Стек в "образ" не входит.


Мне нужно расположить стек конце прикладного адресного пространства .
Надо ли для этого явно инициализовать esp нулем.?
Какой простой путь это сделать в asm-программе для колибри?


Вернуться к началу
 Заголовок сообщения: Re: Работа со стеком
СообщениеДобавлено: Ср июн 27, 2012 9:06 am 
Не в сети

Зарегистрирован: Вс фев 18, 2007 8:34 pm
Сообщения: 158
Нынче в Колибри прикладное адресное пространство располагается в нижней части вирт. адресного пространства, так что нулем по-любому esp инициализировать не надо. Вписывать нужное значение esp в заголовок исполняемого файла тоже не вариант. Единственное решение, которое я вижу, - сделать первоначальный прикладной стек пустым (или небольшим), совместив значение esp (в заголовке) с вершиной памяти для приложения (там же), а потом распределить память в конце прикладного пространства (если такое возможно - см. функции распределения памяти) и переустановить esp программно на вершину этой области. Еще нужно уточнить, практикуется ли в Колибри переменный размер прикладного пространства/пространства ядра. Если да, то нужно как-то узнавать вершину прикладного пространства.


Вернуться к началу
 Заголовок сообщения: Re: Работа со стеком
СообщениеДобавлено: Ср июн 27, 2012 3:30 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Вт июн 19, 2012 7:04 am
Сообщения: 16
Колибри поставил только неделю назад. ОС для меня совершенно новая.
Поэтому много непоняток. Раньше имел опыт ассемблера под DOS.
Сейчас пытаюсь написать для Колибри транслятор программ на Ассемблер
для двух стековой Forth-машины


Мне нужно такое распределение памяти:

Код:
0             2048         4096               8192        10240
|_____________|____________|__________________|___________|
      код         данные                   <--^        <--^                 
                                            ebp          esp


Как это реализовать для колибри?


Вернуться к началу
 Заголовок сообщения: Re: Работа со стеком
СообщениеДобавлено: Ср июн 27, 2012 11:00 pm 
Не в сети

Зарегистрирован: Пн сен 24, 2007 11:11 am
Сообщения: 2814
Вот именно такое, чтобы 2 кб кода, потом данные, а потом стек? Использовать директиву org.
Но не факт, что все данные кода поместятся в 2 кб.
В Колибри используется плоская модель памяти. Никаких сегментов, приложение может адресовать память с байта номер 0 по байт 0x8FFFFFFF, при условии, что приложение затребует 2 Гб памяти при инициализации, и система столько памяти сможет выделить. Кроме памяти, резервируемой приложением при старте, можно получать еще куски памяти нужного размера через malloc.


Вернуться к началу
 Заголовок сообщения: Re: Работа со стеком
СообщениеДобавлено: Чт июн 28, 2012 12:55 pm 
Не в сети

Зарегистрирован: Вс фев 18, 2007 8:34 pm
Сообщения: 158
ywaw1 писал(а):
Мне нужно такое распределение памяти...
Это не разметка со стеком в конце прикладного адресного пространства, а как раз-таки типичная для Колибри разметка. Делается так:
Код:
  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

Но как верно было замечено, код и данные имеют переменную длину, поэтому лучше не ограничивать их размер явно, а просто выравнивать их начало на определенную границу, если это вообще необходимо, а память под стек резервировать с явным указанием нужного размера. Например так:
Код:
  ...
start:
  ...
code_end:
  align 4
  ...
data_end:
  align 4
  ...
bss_end:
  align 4
  rb 4000h ; 16 кб под стек
stack_end:


Вернуться к началу
 Заголовок сообщения: Re: Работа со стеком
СообщениеДобавлено: Чт июн 28, 2012 1:30 pm 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4080
Объясните мне зачем нужно выравнивание. Что оно делает и в чём профит.

_________________
Через тернии к звездам


Вернуться к началу
 Заголовок сообщения: Re: Работа со стеком
СообщениеДобавлено: Чт июн 28, 2012 5:52 pm 
Не в сети

Зарегистрирован: Пн сен 24, 2007 11:11 am
Сообщения: 2814
Процессор работает с данными в 32-битном режиме. Соответственно, он читает данные из памяти по 4 байта за 1 обращение к ОЗУ, грубо говоря. Если у тебя данные хранятся вот так:

Код:
.org 0
sbyte db 10
sdword dw 20,30,40,50


то чтение sdword в память займет больше времени, чем могло бы. Для этого нужно выравнивание памяти.


Вернуться к началу
 Заголовок сообщения: Re: Работа со стеком
СообщениеДобавлено: Чт июн 28, 2012 7:15 pm 
Не в сети
Just Flooding

Зарегистрирован: Сб янв 06, 2007 2:30 pm
Сообщения: 269
> 0x8FFFFFFF
0x7FFFFFFF тогда уж.


Вернуться к началу
 Заголовок сообщения: Re: Работа со стеком
СообщениеДобавлено: Пт июн 29, 2012 8:43 pm 
Не в сети

Зарегистрирован: Пн мар 27, 2006 6:33 am
Сообщения: 522
ywaw1 писал(а):
Сейчас пытаюсь написать для Колибри транслятор программ на Ассемблер
для двух стековой Forth-машины

Может "оттолкнуться" от существующего варианта Форта для Колибри сделанного с использованием форт-системы SPF4
KolSPForth

P.S. Русский форум по Форт языку
Можно взять готовые наработки
Один из трансляторов Форта в Аsm ForthEC

Mihail также встроил Форт в ядро Колибри Форт в ядре колибри


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 26 сообщений ]  На страницу Пред. 1 2

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB