Нубский вопрос про память

Applications development, KoOS API questions
  • elexio wrote:Я тут разбирал на досуге ваш примерчик example.asm, немного с ним поэкспериментировал и заметил, что реально ему требуется для работы около 215 байт памяти, в то время как используется 1000 байт.
    Прошу не забрасывать помидорами, я в этом вопросе нуб)) Я решил указать размер используемой памяти не прямо, типа "dd 0x1000", а через размер программы, типа "dd I_END+10". Если написать просто I_END, то данные в памяти не уместятся, несмотря на мои надежды :D

    Отсюда вопрос, есть ли способ точно определить размер памяти, требуемой для работы программы ? В этом конкретном случае это делается просто, но я думаю, что это только из-за простоты примера или нет?)
    На самом деле программе не может выделяться менее 4 Кб памяти - таков физический размер страницы памяти на аппаратном уровне.

    Чтобы в программах не возникало проблем с ручным определением размеров ставят метки и потом их используют. В приведенном случае (когда уже файл был изменен) наверняка не учтен размер стека и потому данные заносимые в стек затирают код или другие данные.

    Правильно делать так:

    Code: Select all

      use32              ; включить 32-битный режим ассемблера
      org    0x0         ; адресация с нуля
    
      db     'MENUET01'  ; 8-байтный идентификатор MenuetOS
      dd     0x01        ; версия заголовка (всегда 1)
      dd     START       ; адрес первой команды
      dd     IM_END       ; размер программы
      dd     I_END      ; количество памяти
      dd     STACK_TOP    ; адрес вершины стэка
      dd     0x0         ; адрес буфера для параметров
      dd     0x0         ; зарезервировано
    
    ...
    
    START:
    
    ...
    
    IM_END:
    
    ; не инициализированные данные
    
    ; стек
    align4
     rb 256
    STACK_TOP:
    
    ; могут быть еще какие то не инициализированные данные
    
    I_END:  ; конец памяти с которой работает программа
    
    Стек растет сверху вниз. Размер стека определяется потребностями программы и вызываемых функций ядра.
    Last edited by Mario_r4 on Fri Apr 11, 2014 12:31 pm, edited 1 time in total.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Code: Select all

    align4
     rb 255
    STACK_TOP:
    Может, правильнее резервировать 256 байт? А то выравнивание бесполезно... Или я что-то не понимаю?
  • Albom wrote:

    Code: Select all

    align4
     rb 255
    STACK_TOP:
    Может, правильнее резервировать 256 байт? А то выравнивание бесполезно... Или я что-то не понимаю?
    Да, извиняюсь, разумеется 256. :-)
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Как я понимаю, rb 255 это все равно, что к адресу метки I_END прибавить 255, стек выходит такой же(начальное значение esp), зато всевозможных меток на порядок меньше.
    Как ни крути, все равно где-то нужно указать в цифрах, сколько места дополнительно требуется, хоть в rb, хоть как...
    Довольно занятно))) Спасибо за помощь)

    аа, понял, это делается для выравнивания))
  • elexio wrote:зато всевозможных меток на порядок меньше.
    Как уже показала практика - лучше иметь кучу меток, чем вручную указывать "магические" числа для смещений. При компиляции FASM может сам посчитать что и куда, это намного облегчает работу программиста.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Количество меток не на что не влияет. Метка по сути - всего лишь константа, которая сама рассчитывается и при компиляции заменяется на нужное значение/смещение.
  • Я тут снова поковырял тот пример чтоб посмотреть, как работают системные функции и возник вопрос. Как вывести на экран результат работы функции? Функция обычно возвращает результат в регистр eax, но чтобы этот результат как-то использовать(=вывести на экран), надо вначале с регистра этот результат куда-то сохранить. Как это обычно делается?)
  • Вывод на доску отладки (BOARD) viewtopic.php?f=32&t=602
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • e-andrew wrote:Количество меток не на что не влияет. Метка по сути - всего лишь константа, которая сама рассчитывается и при компиляции заменяется на нужное значение/смещение.
    У меня фобия - боюсь заблудиться в метках)
  • elexio, я примерно так делаю:

    Code: Select all

    ORG 0
    BITS 32
    
    PATH_SIZE   equ 1024
    PARAMS_SIZE equ 256
    STACK_SIZE  equ 256
    
            db     "MENUET01"
            dd     1
            dd     START
            dd     END
            dd     END + PATH_SIZE + PARAMS_SIZE + STACK_SIZE
            dd     END + PATH_SIZE + PARAMS_SIZE + STACK_SIZE
            dd     END + PATH_SIZE
            dd     END
    
    START:
    
    END:
    Например, здесь http://websvn.kolibrios.org/filedetails ... FTimer.asm
    или здесь http://websvn.kolibrios.org/filedetails ... FRunOD.asm
    или поменьше пример для JWASM viewtopic.php?f=2&t=2586&p=55776#p55776
  • Только END надо сразу выравнивать на 4 байта.
  • elexio wrote:Я тут снова поковырял тот пример чтоб посмотреть, как работают системные функции и возник вопрос. Как вывести на экран результат работы функции? Функция обычно возвращает результат в регистр eax, но чтобы этот результат как-то использовать(=вывести на экран), надо вначале с регистра этот результат куда-то сохранить. Как это обычно делается?)
    я делаю так:

    Code: Select all

        ; в eax значение - допустим число
        push    eax ; ложу его в стек
        mov     eax,47 ; вывод числа
        mov     ebx,256+8 shl 16 ; вывожу в 16-ричном формате
        mov     esi,[sc.win_text] ; цвет
        pop     eсx ; достаю из стека в ecx
        mov     edx,10 shl 16 + 10 ; 10 по x и 10 по y
        int     0x40 ; вывожу
    http://wiki.kolibrios.org/wiki/SysFn47/ru
    http://wiki.kolibrios.org/wiki/SysFn04/ru
  • А сразу mov ecx, eax ?
  • Serge wrote:А сразу mov ecx, eax ?
    я просто сохранил заполнение параметров по порядку, как в wiki ) для наглядности!
  • Who is online

    Users browsing this forum: Google [Bot] and 6 guests