Page 1 of 1

Какое наибольшее количество памяти можно выделить программе?

Posted: Fri Oct 24, 2008 6:53 am
by exst
Всем доброго утра! пробовал выделить 3МБ - не получается (((.
Планировал переписать программку, моделирующую электростатическое поле под Колибри.

Re: Какое наибольшее количество памяти можно выделить программе?

Posted: Fri Oct 24, 2008 7:01 am
by <Lrz>
Код в студию ) После этого можно будет что-либо говорить

Re: Какое наибольшее количество памяти можно выделить программе?

Posted: Fri Oct 24, 2008 7:13 am
by exst
Да кода пока еще нету. Как описано в документации создаю окно:

Code: Select all

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

Re: Какое наибольшее количество памяти можно выделить программе?

Posted: Fri Oct 24, 2008 7:37 am
by <Lrz>
Конечно, очень загнул )) Память нужную тебе, нужно выделять требуя у системы, в момент выполнения программы.

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

Re: Какое наибольшее количество памяти можно выделить программе?

Posted: Fri Oct 24, 2008 7:47 am
by exst
Спасибо. Буду пробовать.

Re: Какое наибольшее количество памяти можно выделить программе?

Posted: Fri Oct 24, 2008 9:03 am
by exst
Получилось! )

Re: Какое наибольшее количество памяти можно выделить программе?

Posted: Fri Oct 24, 2008 10:09 am
by mike.dld
Для сведения, могло бы получиться и без 64-й функции. Проблема в том, вероятно, что 0x3000000 != 3МБ, 0x3000000 == 48МБ. Не нужно путать 16 и 10 СС.

Re: Какое наибольшее количество памяти можно выделить программе?

Posted: Fri Oct 24, 2008 2:24 pm
by exst
Да-да... Я заметил... )

Re: Какое наибольшее количество памяти можно выделить программе?

Posted: Fri Oct 24, 2008 7:29 pm
by exst
Нарисовался ещё вопрос: в какой области теперь находится стёк?

Re: Какое наибольшее количество памяти можно выделить программе?

Posted: Mon Oct 27, 2008 7:43 am
by <Lrz>
В программах используется плоская модель памяти, а это означает, что стек, данные, код находятся в одном адресном пространстве.
Т.е. cs=ds=ss сегмент кода, данных, стека равны.
Стек находиться в области, где ты его установишь т.е. по какому смещению