Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Чт окт 18, 2018 2:55 pm

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 10 сообщений ] 
Автор Сообщение
СообщениеДобавлено: Пт окт 24, 2008 6:53 am 
Не в сети

Зарегистрирован: Ср окт 22, 2008 11:53 am
Сообщения: 17
Всем доброго утра! пробовал выделить 3МБ - не получается (((.
Планировал переписать программку, моделирующую электростатическое поле под Колибри.


Вернуться к началу
СообщениеДобавлено: Пт окт 24, 2008 7:01 am 
Не в сети
Kernel Optimizer
Аватара пользователя

Зарегистрирован: Пн янв 16, 2006 7:58 pm
Сообщения: 657
Код в студию ) После этого можно будет что-либо говорить


Вернуться к началу
СообщениеДобавлено: Пт окт 24, 2008 7:13 am 
Не в сети

Зарегистрирован: Ср окт 22, 2008 11:53 am
Сообщения: 17
Да кода пока еще нету. Как описано в документации создаю окно:

Код:
db 'MENUET01'  ; 1. идентификатор исполняемого файла (8 байт)
dd 0x01        ; 2. версия формата заголовка исполняемого файла
dd START       ; 3. адрес, на который система передаёт управление
dd I_END       ; 4. размер приложения
dd 0x3000000   ; 5. объём необходимой приложению памяти
dd 0x3000000   ; 6. вершина стека в диапазоне памяти, указанном выше
dd 0x0          ; 7. указатель на строку с параметрами.
dd 0x0          ; 8. указатель на строку, в которую записан путь,

START:
   call draw_window

event_wait:
   mov eax, 10
   int 0x40
   cmp eax, 1
   je  redraw
   cmp eax, 2
   je   key
   cmp eax, 3
   je   button
   
   jmp event_wait

redraw:
   call draw_window
   jmp event_wait
   
key:
   mov eax, 2
   int 0x40
   jmp event_wait

button:
   mov eax, 17
   int 0x40
   cmp ah , 1
   jne noclose
   mov eax, -1
   int 0x40

noclose:
   jmp event_wait
   
draw_window:   
mov   eax,12            ; функция 12: сообщить системе о
                  ; состоянии перерисовки окна
mov   ebx,1            ; подфункция 1, начало перерисовки
int   0x40
mov   eax,0            ; функция 0: определите и выведите окно
mov   ebx,10*65536+640     ; [x начальный] *65536 + [x размер]
mov   ecx,10*65536+480     ; [y начальный] *65536 + [y размер]
mov   edx,0x02ffffff         ; цвет рабочей области RRGGBB
                  ; 0x02000000 = тип окна 2 (что это
                  ; значит, я объясню в следующий раз)
mov   esi,0x808899ff         ; цвет области заголовка RRGGBB
                  ; 0x80000000 = цвет перетекает
mov   edi,0x008899ff         ; цвет рамки RRGGBB
int   0x40
                  ; НАДПИСЬ в заголовке
mov   eax,4            ; функция 4: написать текст в окне
mov   ebx,8*65536+8         ; [x начальный] *65536 + [y начальный]
mov   ecx,0x00ddeeff         ; цвет текста RRGGBB
                  ; старший байт (0x00) - размер шрифта
                  ; (маленький)
mov   edx,text         ; указатель на начало текста
mov   esi,text_end-text      ; длина текста в байтах
int   0x40
                  ; КНОПКА
mov   eax,8            ; функция 8: определить и вывести кнопку
mov   ebx,(640-19)*65536+12 ; [x начальный] *65536 + [x размер]
mov   ecx,5*65536+12         ; [y начальный] *65536 + [y размер]
mov   edx,1            ; идентификатор кнопки
mov   esi,0x6677cc         ; цвет кнопки RRGGBB
int   0x40

mov   eax,12            ; функция 12: сообщить системе о
                  ; состоянии перерисовки окна
mov   ebx,2            ; подфункция 2, перерисовка окончена
int   0x40
 
ret
   
text db 'Модель электростатического поля'
text_end:
I_END:


Память понадобится под хранение (640x480x8 = 2457600 Б) массива дробных чисел.
смыщает то, что код уже на данном этапе не запускается. Пожет я загнул с 3000000 в заголовке?


Вернуться к началу
СообщениеДобавлено: Пт окт 24, 2008 7:37 am 
Не в сети
Kernel Optimizer
Аватара пользователя

Зарегистрирован: Пн янв 16, 2006 7:58 pm
Сообщения: 657
Конечно, очень загнул )) Память нужную тебе, нужно выделять требуя у системы, в момент выполнения программы.

Функция 64 - перераспределить память приложения.
Параметры:
eax = 64 - номер функции
ebx = 1 - единственная подфункция
ecx = новый размер памяти
Возвращаемое значение:
eax = 0 - успешно
eax = 1 - недостаточно памяти


Вернуться к началу
СообщениеДобавлено: Пт окт 24, 2008 7:47 am 
Не в сети

Зарегистрирован: Ср окт 22, 2008 11:53 am
Сообщения: 17
Спасибо. Буду пробовать.


Вернуться к началу
СообщениеДобавлено: Пт окт 24, 2008 9:03 am 
Не в сети

Зарегистрирован: Ср окт 22, 2008 11:53 am
Сообщения: 17
Получилось! )


Вернуться к началу
СообщениеДобавлено: Пт окт 24, 2008 10:09 am 
Не в сети
Site Founder
Аватара пользователя

Зарегистрирован: Вс авг 08, 2004 8:55 am
Сообщения: 689
Для сведения, могло бы получиться и без 64-й функции. Проблема в том, вероятно, что 0x3000000 != 3МБ, 0x3000000 == 48МБ. Не нужно путать 16 и 10 СС.

_________________
in code we trust


Вернуться к началу
СообщениеДобавлено: Пт окт 24, 2008 2:24 pm 
Не в сети

Зарегистрирован: Ср окт 22, 2008 11:53 am
Сообщения: 17
Да-да... Я заметил... )


Вернуться к началу
СообщениеДобавлено: Пт окт 24, 2008 7:29 pm 
Не в сети

Зарегистрирован: Ср окт 22, 2008 11:53 am
Сообщения: 17
Нарисовался ещё вопрос: в какой области теперь находится стёк?


Вернуться к началу
СообщениеДобавлено: Пн окт 27, 2008 7:43 am 
Не в сети
Kernel Optimizer
Аватара пользователя

Зарегистрирован: Пн янв 16, 2006 7:58 pm
Сообщения: 657
В программах используется плоская модель памяти, а это означает, что стек, данные, код находятся в одном адресном пространстве.
Т.е. cs=ds=ss сегмент кода, данных, стека равны.
Стек находиться в области, где ты его установишь т.е. по какому смещению


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 10 сообщений ] 

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB