Page 1 of 1

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

Posted: Fri Apr 11, 2014 9:33 am
by elexio
Я тут разбирал на досуге ваш примерчик example.asm, немного с ним поэкспериментировал и заметил, что реально ему требуется для работы около 215 байт памяти, в то время как используется 1000 байт.
Прошу не забрасывать помидорами, я в этом вопросе нуб)) Я решил указать размер используемой памяти не прямо, типа "dd 0x1000", а через размер программы, типа "dd I_END+10". Если написать просто I_END, то данные в памяти не уместятся, несмотря на мои надежды :D

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

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

Posted: Fri Apr 11, 2014 10:13 am
by Mario_r4
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:  ; конец памяти с которой работает программа
Стек растет сверху вниз. Размер стека определяется потребностями программы и вызываемых функций ядра.

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

Posted: Fri Apr 11, 2014 12:25 pm
by Albom

Code: Select all

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

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

Posted: Fri Apr 11, 2014 12:31 pm
by Mario_r4
Albom wrote:

Code: Select all

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

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

Posted: Fri Apr 11, 2014 12:45 pm
by elexio
Как я понимаю, rb 255 это все равно, что к адресу метки I_END прибавить 255, стек выходит такой же(начальное значение esp), зато всевозможных меток на порядок меньше.
Как ни крути, все равно где-то нужно указать в цифрах, сколько места дополнительно требуется, хоть в rb, хоть как...
Довольно занятно))) Спасибо за помощь)

аа, понял, это делается для выравнивания))

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

Posted: Fri Apr 11, 2014 12:50 pm
by Mario_r4
elexio wrote:зато всевозможных меток на порядок меньше.
Как уже показала практика - лучше иметь кучу меток, чем вручную указывать "магические" числа для смещений. При компиляции FASM может сам посчитать что и куда, это намного облегчает работу программиста.

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

Posted: Fri Apr 11, 2014 2:37 pm
by e-andrew
Количество меток не на что не влияет. Метка по сути - всего лишь константа, которая сама рассчитывается и при компиляции заменяется на нужное значение/смещение.

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

Posted: Fri Apr 11, 2014 3:54 pm
by elexio
Я тут снова поковырял тот пример чтоб посмотреть, как работают системные функции и возник вопрос. Как вывести на экран результат работы функции? Функция обычно возвращает результат в регистр eax, но чтобы этот результат как-то использовать(=вывести на экран), надо вначале с регистра этот результат куда-то сохранить. Как это обычно делается?)

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

Posted: Fri Apr 11, 2014 3:56 pm
by Mario_r4
Вывод на доску отладки (BOARD) viewtopic.php?f=32&t=602

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

Posted: Fri Apr 11, 2014 4:07 pm
by elexio
e-andrew wrote:Количество меток не на что не влияет. Метка по сути - всего лишь константа, которая сама рассчитывается и при компиляции заменяется на нужное значение/смещение.
У меня фобия - боюсь заблудиться в метках)

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

Posted: Fri Apr 11, 2014 7:19 pm
by 0CodErr
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

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

Posted: Sat Apr 12, 2014 8:57 am
by Serge
Только END надо сразу выравнивать на 4 байта.

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

Posted: Sat Apr 12, 2014 10:18 am
by Akyltist
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

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

Posted: Sat Apr 12, 2014 11:27 am
by Serge
А сразу mov ecx, eax ?

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

Posted: Sat Apr 12, 2014 1:49 pm
by Akyltist
Serge wrote:А сразу mov ecx, eax ?
я просто сохранил заполнение параметров по порядку, как в wiki ) для наглядности!