Всем доброго утра! пробовал выделить 3МБ - не получается (((.
Планировал переписать программку, моделирующую электростатическое поле под Колибри.
Какое наибольшее количество памяти можно выделить программе?
Код в студию ) После этого можно будет что-либо говорить
Да кода пока еще нету. Как описано в документации создаю окно:
Память понадобится под хранение (640x480x8 = 2457600 Б) массива дробных чисел.
смыщает то, что код уже на данном этапе не запускается. Пожет я загнул с 3000000 в заголовке?
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:
смыщает то, что код уже на данном этапе не запускается. Пожет я загнул с 3000000 в заголовке?
Конечно, очень загнул )) Память нужную тебе, нужно выделять требуя у системы, в момент выполнения программы.
Функция 64 - перераспределить память приложения.
Параметры:
eax = 64 - номер функции
ebx = 1 - единственная подфункция
ecx = новый размер памяти
Возвращаемое значение:
eax = 0 - успешно
eax = 1 - недостаточно памяти
Функция 64 - перераспределить память приложения.
Параметры:
eax = 64 - номер функции
ebx = 1 - единственная подфункция
ecx = новый размер памяти
Возвращаемое значение:
eax = 0 - успешно
eax = 1 - недостаточно памяти
Спасибо. Буду пробовать.
Получилось! )
Для сведения, могло бы получиться и без 64-й функции. Проблема в том, вероятно, что 0x3000000 != 3МБ, 0x3000000 == 48МБ. Не нужно путать 16 и 10 СС.
in code we trust
Да-да... Я заметил... )
Нарисовался ещё вопрос: в какой области теперь находится стёк?
В программах используется плоская модель памяти, а это означает, что стек, данные, код находятся в одном адресном пространстве.
Т.е. cs=ds=ss сегмент кода, данных, стека равны.
Стек находиться в области, где ты его установишь т.е. по какому смещению
Т.е. cs=ds=ss сегмент кода, данных, стека равны.
Стек находиться в области, где ты его установишь т.е. по какому смещению
Who is online
Users browsing this forum: Google [Bot] and 21 guests