Я тут разбирал на досуге ваш примерчик example.asm, немного с ним поэкспериментировал и заметил, что реально ему требуется для работы около 215 байт памяти, в то время как используется 1000 байт.
Прошу не забрасывать помидорами, я в этом вопросе нуб)) Я решил указать размер используемой памяти не прямо, типа "dd 0x1000", а через размер программы, типа "dd I_END+10". Если написать просто I_END, то данные в памяти не уместятся, несмотря на мои надежды
Отсюда вопрос, есть ли способ точно определить размер памяти, требуемой для работы программы ? В этом конкретном случае это делается просто, но я думаю, что это только из-за простоты примера или нет?)
Нубский вопрос про память
На самом деле программе не может выделяться менее 4 Кб памяти - таков физический размер страницы памяти на аппаратном уровне.elexio wrote:Я тут разбирал на досуге ваш примерчик example.asm, немного с ним поэкспериментировал и заметил, что реально ему требуется для работы около 215 байт памяти, в то время как используется 1000 байт.
Прошу не забрасывать помидорами, я в этом вопросе нуб)) Я решил указать размер используемой памяти не прямо, типа "dd 0x1000", а через размер программы, типа "dd I_END+10". Если написать просто I_END, то данные в памяти не уместятся, несмотря на мои надежды
Отсюда вопрос, есть ли способ точно определить размер памяти, требуемой для работы программы ? В этом конкретном случае это делается просто, но я думаю, что это только из-за простоты примера или нет?)
Чтобы в программах не возникало проблем с ручным определением размеров ставят метки и потом их используют. В приведенном случае (когда уже файл был изменен) наверняка не учтен размер стека и потому данные заносимые в стек затирают код или другие данные.
Правильно делать так:
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 лет себе в жопу!
Может, правильнее резервировать 256 байт? А то выравнивание бесполезно... Или я что-то не понимаю?Code: Select all
align4 rb 255 STACK_TOP:
Да, извиняюсь, разумеется 256.Albom wrote:Может, правильнее резервировать 256 байт? А то выравнивание бесполезно... Или я что-то не понимаю?Code: Select all
align4 rb 255 STACK_TOP:
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
Как я понимаю, rb 255 это все равно, что к адресу метки I_END прибавить 255, стек выходит такой же(начальное значение esp), зато всевозможных меток на порядок меньше.
Как ни крути, все равно где-то нужно указать в цифрах, сколько места дополнительно требуется, хоть в rb, хоть как...
Довольно занятно))) Спасибо за помощь)
аа, понял, это делается для выравнивания))
Как ни крути, все равно где-то нужно указать в цифрах, сколько места дополнительно требуется, хоть в rb, хоть как...
Довольно занятно))) Спасибо за помощь)
аа, понял, это делается для выравнивания))
Как уже показала практика - лучше иметь кучу меток, чем вручную указывать "магические" числа для смещений. При компиляции FASM может сам посчитать что и куда, это намного облегчает работу программиста.elexio wrote:зато всевозможных меток на порядок меньше.
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
Количество меток не на что не влияет. Метка по сути - всего лишь константа, которая сама рассчитывается и при компиляции заменяется на нужное значение/смещение.
Я тут снова поковырял тот пример чтоб посмотреть, как работают системные функции и возник вопрос. Как вывести на экран результат работы функции? Функция обычно возвращает результат в регистр eax, но чтобы этот результат как-то использовать(=вывести на экран), надо вначале с регистра этот результат куда-то сохранить. Как это обычно делается?)
Вывод на доску отладки (BOARD) viewtopic.php?f=32&t=602
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
У меня фобия - боюсь заблудиться в метках)e-andrew wrote:Количество меток не на что не влияет. Метка по сути - всего лишь константа, которая сама рассчитывается и при компиляции заменяется на нужное значение/смещение.
elexio, я примерно так делаю:Например, здесь http://websvn.kolibrios.org/filedetails ... FTimer.asm
или здесь http://websvn.kolibrios.org/filedetails ... FRunOD.asm
или поменьше пример для JWASM viewtopic.php?f=2&t=2586&p=55776#p55776
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 ... 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/SysFn04/ru
А сразу mov ecx, eax ?
я просто сохранил заполнение параметров по порядку, как в wiki ) для наглядности!Serge wrote:А сразу mov ecx, eax ?
Who is online
Users browsing this forum: Google [Bot] and 6 guests