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, то данные в памяти не уместятся, несмотря на мои надежды
Отсюда вопрос, есть ли способ точно определить размер памяти, требуемой для работы программы ? В этом конкретном случае это делается просто, но я думаю, что это только из-за простоты примера или нет?)
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, то данные в памяти не уместятся, несмотря на мои надежды
Отсюда вопрос, есть ли способ точно определить размер памяти, требуемой для работы программы ? В этом конкретном случае это делается просто, но я думаю, что это только из-за простоты примера или нет?)
На самом деле программе не может выделяться менее 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
Может, правильнее резервировать 256 байт? А то выравнивание бесполезно... Или я что-то не понимаю?
Re: Нубский вопрос про память
Posted: Fri Apr 11, 2014 12:31 pm
by Mario_r4
Albom wrote:
Может, правильнее резервировать 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 ) для наглядности!