Board.KolibriOS.org

Official KolibriOS board
It is currently Wed Oct 28, 2020 3:56 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 10 posts ] 
Author Message
PostPosted: Fri Oct 24, 2008 6:53 am 
Offline

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


Top
   
PostPosted: Fri Oct 24, 2008 7:01 am 
Offline
Kernel Optimizer
User avatar

Joined: Mon Jan 16, 2006 7:58 pm
Posts: 657
Код в студию ) После этого можно будет что-либо говорить


Top
   
PostPosted: Fri Oct 24, 2008 7:13 am 
Offline

Joined: Wed Oct 22, 2008 11:53 am
Posts: 17
Да кода пока еще нету. Как описано в документации создаю окно:

Code:
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 в заголовке?


Top
   
PostPosted: Fri Oct 24, 2008 7:37 am 
Offline
Kernel Optimizer
User avatar

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

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


Top
   
PostPosted: Fri Oct 24, 2008 7:47 am 
Offline

Joined: Wed Oct 22, 2008 11:53 am
Posts: 17
Спасибо. Буду пробовать.


Top
   
PostPosted: Fri Oct 24, 2008 9:03 am 
Offline

Joined: Wed Oct 22, 2008 11:53 am
Posts: 17
Получилось! )


Top
   
PostPosted: Fri Oct 24, 2008 10:09 am 
Offline
Site Founder
User avatar

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

_________________
in code we trust


Top
   
PostPosted: Fri Oct 24, 2008 2:24 pm 
Offline

Joined: Wed Oct 22, 2008 11:53 am
Posts: 17
Да-да... Я заметил... )


Top
   
PostPosted: Fri Oct 24, 2008 7:29 pm 
Offline

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


Top
   
PostPosted: Mon Oct 27, 2008 7:43 am 
Offline
Kernel Optimizer
User avatar

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


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 10 posts ] 

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited