Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
caged19
0 / 0 / 0
Регистрация: 01.11.2013
Сообщений: 17
1

Изменение размера блока памяти

14.02.2015, 00:07. Просмотров 699. Ответов 3
Метки нет (Все метки)

Подскажите пожалуйста, как правильно освободить лишнюю память в exe программе.
Достаточно ли этой функции?
Функции 4AH (0x4A или 74) --> Изменить размер блока памяти
Call with: AH = 4AH
BX = desired new block size in paragraphs
ES = segment of block to be modified

Вот здесь используется эта функция.
Кликните здесь для просмотра всего текста

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
.model small
.data
msg1    db 13,10,'Trying execute second.exe$'
msg2    db 13,10,'Error$'
msg3    db 13,10,'First terminating. Press any key$'
fn  db 'second.exe',0   ;Имя запускаемого файла
param   db 10,' bufer.txt',13   ;командная строка
; === Exec Parameter Block (EPB) для функции 4Bh ===
env dw 0            ;Сегмент среды (окружения DOS) для загружаемой программы
cmd_of  dw offset param     ;Смещение командной строки +
cmd_seg dw @data        ;+ сегмент командной строки
fcb1    dd 0            ;FCB (не используется)
fcb2    dd 0            ;FCB (не используется)
Len dw $-env  ;Длина EPB
dsize=$-msg1        ;размер сегмента данных
 
.stack 256
.code
start:
    mov ah,4ah      ;функция изменения размера блока памяти
    mov bx,((csize/16)+1)+256/16+((dsize/16)+1)+256/16;новый размер программы с учетом всех сегментов
    int 21h     ;ограничиваем блок данных нашей программы
    mov ax,@data    ;Настраиваем сегментные регистры
    mov ds,ax
    mov es,ax
    mov ah,9        ;функция вывода сообщения на экран
    lea dx,msg1     ;выводимое сообщение
    int 21h         ;выводим на экран
    mov ax,4b00h        ;Функция EXEC (EXECute - загрузка и запуск программы)
    lea dx,fn       ;Имя файла для запуска
    lea bx,env      ; --- Готовим EPB ---
    int 21h         ;запуск
    jb er           ;если ошибка - переход
ex: mov ah,9        ;функция вывода сообщения на экран
    lea dx,msg3     ;выводимое сообщение
    int 21h         ;выводим на экран
    mov ah,1        ;Ожидаем нажатия любой клавиши
    int 21h
    mov ax,4c00h        ;закончить программу
    int 21h
er: mov ah,9        ;функция вывода сообщения на экран
    lea dx,msg2     ;выводимое сообщение
    int 21h         ;выводим на экран
    jmp ex          ;выход
csize=$-start           ;размер сегмента кода
end start

mov bx,((csize/16)+1)+256/16+((dsize/16)+1)+256/16
Если менять значения в этой формуле, то почему-то размер программы не меняется. Подскажите.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.02.2015, 00:07
Ответы с готовыми решениями:

С помощью битовых операций запишите число в ячейку памяти минимального размера
Дано пятизначное число. (Может быть например такое 00001). С помощью битовых...

На какую область памяти указывает адрес недоступной памяти
Здравствуйте! Написал программу, выводит (из PSP) сегментный адрес первого...

Изменение размера текста
Есть код, который выводит сообщение на экран: mov al, 1 mov bh, 0 mov bl,...

Определение размера оперативной памяти
Здравствуйте! Каким образом можно определить размер оперативной памяти и...

Заполнение блока памяти из N слов рядом натуральных чисел
Срочно нужна помощь с лабой. Вот задание: Составить процедуру (тип NEAR)...

3
Argogo
639 / 240 / 40
Регистрация: 29.03.2013
Сообщений: 532
14.02.2015, 15:32 2
Цитата Сообщение от caged19 Посмотреть сообщение
Достаточно ли этой функции?
Вполне.

Цитата Сообщение от caged19 Посмотреть сообщение
Если менять значения в этой формуле, то почему-то размер программы не меняется. Подскажите.
размер взят не с потолка, менять руками его не стоит. Оставишь программе меньше памяти, чем ей надо - результат будет непредсказуемый, но скорее всего повиснет или уйдёт в перезагрузку. Но проще не занимать лишнего.

caged19, у EXE-файлов есть отличная возможность не занимать "лишнюю" память. Для этого достаточно просто отредактировать в заголовке соответствующее поле, и тогда под EXE-шник будет выделена не вся память сверх необходимого для загрузки (значение поля в параграфах равно 0FFFFh), а ровно столько, сколько там будет указано (от минимально необходимого до доступного количества свободных параграфов в пределах "нижней" (обычно до адресов начала видеобуфера, до сегмента 0A000h)).

Минимально необходимый размер находится по смещению 0Ah.
Максимально необходимый размер находится по смещению 0Сh.
Размеры обоих полей - слово.
Делаешь слово по смещению 0Ch равным слову по смещению 0Ah и после запуска программы вся остальная память доступна для использования без предварительного освобождения.
1
caged19
0 / 0 / 0
Регистрация: 01.11.2013
Сообщений: 17
14.02.2015, 17:18  [ТС] 3
а что за значения в формуле?
mov bx,((csize/16)+1)+256/16+((dsize/16)+1)+256/16
csize и dsize нужно делить на 16, чтобы получить размер в параграфах?
а зачем прибавлять 1 и почему 256/16 два раза?
0
alexcoder
1844 / 714 / 149
Регистрация: 03.06.2009
Сообщений: 4,290
Завершенные тесты: 1
15.02.2015, 09:52 4
Цитата Сообщение от caged19 Посмотреть сообщение
csize и dsize нужно делить на 16, чтобы получить размер в параграфах?
да
Цитата Сообщение от caged19 Посмотреть сообщение
а зачем прибавлять 1
чтобы учесть отброшенный остаток при делении. 103/16 даст 6, а надо 7 параграфов.
Цитата Сообщение от caged19 Посмотреть сообщение
почему 256/16 два раза?
стек и PSP
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.02.2015, 09:52

Изменение размера блока в зависимости от его размера
Ребят в JS я вообще новичок, и при создании блога вышел нюанс, что без js не...

Изменение размера блока
При клике на блок, происходит событие : function width(){ ...

Изменение размера блока div
Всем привет. Реально ли как то сделать автоматическое изменение размеров блока...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru