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

Assembler programming questions
  • Об этом собственно и был вопрос - глупость разработчиков или тонкость хитрого интела.
  • Phantom-84 wrote:Часто приходилось встречать, когда для 16-разрядных сегментов (обычно реального режима) устанавливают вершину стека 0FFFFh, боясь использовать 0. Возможно, использование указателей стека типа xxxFFFh вызвано этим же. Кстати, в моем "упрощенном исполняемом формате" нет поля для явного хранения указателя стека (только размеры). Это позволяет свободно располагать стек первичного прикладного потока в конце прикладного адресного пространства вне зависимости от размера пространства. Стек в "образ" не входит.
    Мне нужно расположить стек конце прикладного адресного пространства .
    Надо ли для этого явно инициализовать esp нулем.?
    Какой простой путь это сделать в asm-программе для колибри?
  • Нынче в Колибри прикладное адресное пространство располагается в нижней части вирт. адресного пространства, так что нулем по-любому esp инициализировать не надо. Вписывать нужное значение esp в заголовок исполняемого файла тоже не вариант. Единственное решение, которое я вижу, - сделать первоначальный прикладной стек пустым (или небольшим), совместив значение esp (в заголовке) с вершиной памяти для приложения (там же), а потом распределить память в конце прикладного пространства (если такое возможно - см. функции распределения памяти) и переустановить esp программно на вершину этой области. Еще нужно уточнить, практикуется ли в Колибри переменный размер прикладного пространства/пространства ядра. Если да, то нужно как-то узнавать вершину прикладного пространства.
  • Колибри поставил только неделю назад. ОС для меня совершенно новая.
    Поэтому много непоняток. Раньше имел опыт ассемблера под DOS.
    Сейчас пытаюсь написать для Колибри транслятор программ на Ассемблер
    для двух стековой Forth-машины


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

    Code: Select all

    0             2048         4096               8192        10240
    |_____________|____________|__________________|___________|
          код         данные                   <--^        <--^                 
                                                ebp          esp
    
    Как это реализовать для колибри?
  • Вот именно такое, чтобы 2 кб кода, потом данные, а потом стек? Использовать директиву org.
    Но не факт, что все данные кода поместятся в 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 обращение к ОЗУ, грубо говоря. Если у тебя данные хранятся вот так:

    Code: Select all

    .org 0
    sbyte db 10
    sdword dw 20,30,40,50
    
    то чтение sdword в память займет больше времени, чем могло бы. Для этого нужно выравнивание памяти.
  • > 0x8FFFFFFF
    0x7FFFFFFF тогда уж.
  • ywaw1 wrote: Сейчас пытаюсь написать для Колибри транслятор программ на Ассемблер
    для двух стековой Forth-машины
    Может "оттолкнуться" от существующего варианта Форта для Колибри сделанного с использованием форт-системы SPF4
    KolSPForth

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

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

    Users browsing this forum: No registered users and 3 guests