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

Assembler programming questions
  • Код в студию ) После этого можно будет что-либо говорить
  • Да кода пока еще нету. Как описано в документации создаю окно:

    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 в заголовке?
  • Конечно, очень загнул )) Память нужную тебе, нужно выделять требуя у системы, в момент выполнения программы.

    Функция 64 - перераспределить память приложения.
    Параметры:
    eax = 64 - номер функции
    ebx = 1 - единственная подфункция
    ecx = новый размер памяти
    Возвращаемое значение:
    eax = 0 - успешно
    eax = 1 - недостаточно памяти
  • Спасибо. Буду пробовать.
  • Получилось! )
  • Для сведения, могло бы получиться и без 64-й функции. Проблема в том, вероятно, что 0x3000000 != 3МБ, 0x3000000 == 48МБ. Не нужно путать 16 и 10 СС.
    in code we trust
  • Да-да... Я заметил... )
  • Нарисовался ещё вопрос: в какой области теперь находится стёк?
  • В программах используется плоская модель памяти, а это означает, что стек, данные, код находятся в одном адресном пространстве.
    Т.е. cs=ds=ss сегмент кода, данных, стека равны.
    Стек находиться в области, где ты его установишь т.е. по какому смещению
  • Who is online

    Users browsing this forum: No registered users and 3 guests