Page 2 of 2

Re: Работа со стеком

Posted: Tue Sep 20, 2011 9:54 pm
by Phantom-84
Я понимаю. Но кроме как боязнью использовать вершину предназначенной для стека области памяти в качестве указателя стека или полным непониманием устройства стека в x86 я не могу объяснить использование указателей стека типа xxxFFFh. Тогда уж лучше xxxFFCh, т.е. на лицо еще и непонимание роли выравнивания при обращениях к памяти.

Re: Работа со стеком

Posted: Tue Sep 20, 2011 10:05 pm
by Mario
Об этом собственно и был вопрос - глупость разработчиков или тонкость хитрого интела.

Re: Работа со стеком

Posted: Mon Jun 25, 2012 8:50 pm
by ywaw1
Phantom-84 wrote:Часто приходилось встречать, когда для 16-разрядных сегментов (обычно реального режима) устанавливают вершину стека 0FFFFh, боясь использовать 0. Возможно, использование указателей стека типа xxxFFFh вызвано этим же. Кстати, в моем "упрощенном исполняемом формате" нет поля для явного хранения указателя стека (только размеры). Это позволяет свободно располагать стек первичного прикладного потока в конце прикладного адресного пространства вне зависимости от размера пространства. Стек в "образ" не входит.
Мне нужно расположить стек конце прикладного адресного пространства .
Надо ли для этого явно инициализовать esp нулем.?
Какой простой путь это сделать в asm-программе для колибри?

Re: Работа со стеком

Posted: Wed Jun 27, 2012 9:06 am
by Phantom-84
Нынче в Колибри прикладное адресное пространство располагается в нижней части вирт. адресного пространства, так что нулем по-любому esp инициализировать не надо. Вписывать нужное значение esp в заголовок исполняемого файла тоже не вариант. Единственное решение, которое я вижу, - сделать первоначальный прикладной стек пустым (или небольшим), совместив значение esp (в заголовке) с вершиной памяти для приложения (там же), а потом распределить память в конце прикладного пространства (если такое возможно - см. функции распределения памяти) и переустановить esp программно на вершину этой области. Еще нужно уточнить, практикуется ли в Колибри переменный размер прикладного пространства/пространства ядра. Если да, то нужно как-то узнавать вершину прикладного пространства.

Re: Работа со стеком

Posted: Wed Jun 27, 2012 3:30 pm
by ywaw1
Колибри поставил только неделю назад. ОС для меня совершенно новая.
Поэтому много непоняток. Раньше имел опыт ассемблера под DOS.
Сейчас пытаюсь написать для Колибри транслятор программ на Ассемблер
для двух стековой Forth-машины


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

Code: Select all

0             2048         4096               8192        10240
|_____________|____________|__________________|___________|
      код         данные                   <--^        <--^                 
                                            ebp          esp
Как это реализовать для колибри?

Re: Работа со стеком

Posted: Wed Jun 27, 2012 11:00 pm
by SoUrcerer
Вот именно такое, чтобы 2 кб кода, потом данные, а потом стек? Использовать директиву org.
Но не факт, что все данные кода поместятся в 2 кб.
В Колибри используется плоская модель памяти. Никаких сегментов, приложение может адресовать память с байта номер 0 по байт 0x8FFFFFFF, при условии, что приложение затребует 2 Гб памяти при инициализации, и система столько памяти сможет выделить. Кроме памяти, резервируемой приложением при старте, можно получать еще куски памяти нужного размера через malloc.

Re: Работа со стеком

Posted: Thu Jun 28, 2012 12:55 pm
by Phantom-84
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:

Re: Работа со стеком

Posted: Thu Jun 28, 2012 1:30 pm
by Leency
Объясните мне зачем нужно выравнивание. Что оно делает и в чём профит.

Re: Работа со стеком

Posted: Thu Jun 28, 2012 5:52 pm
by SoUrcerer
Процессор работает с данными в 32-битном режиме. Соответственно, он читает данные из памяти по 4 байта за 1 обращение к ОЗУ, грубо говоря. Если у тебя данные хранятся вот так:

Code: Select all

.org 0
sbyte db 10
sdword dw 20,30,40,50
то чтение sdword в память займет больше времени, чем могло бы. Для этого нужно выравнивание памяти.

Re: Работа со стеком

Posted: Thu Jun 28, 2012 7:15 pm
by Nable
> 0x8FFFFFFF
0x7FFFFFFF тогда уж.

Re: Работа со стеком

Posted: Fri Jun 29, 2012 8:43 pm
by Kopa
ywaw1 wrote: Сейчас пытаюсь написать для Колибри транслятор программ на Ассемблер
для двух стековой Forth-машины
Может "оттолкнуться" от существующего варианта Форта для Колибри сделанного с использованием форт-системы SPF4
KolSPForth

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

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