Вопрос № 20153: Здравствуйте, эксперты! Как захватить определённый физический адрес
памяти? P.S. Понимаю, что вопрос не по Асму, но ответ на него можете
знать только вы. Есть такая дефицитная штука, как модуль SDRAM на 512M
и в нём с недавнего времени 11...Вопрос № 20161: Я тут задавал вопрос про массивы(номер 20130). Получил ответ (спасибо Евгению Иванову). Как я понял этот ответ относится к программированию в среде Windows. Хотелось бы получить ответ, относительно программирования под DOS (с использованием TASM)....
Вопрос № 20153
Здравствуйте, эксперты! Как захватить определённый физический адрес
памяти? P.S. Понимаю, что вопрос не по Асму, но ответ на него можете
знать только вы. Есть такая дефицитная штука, как модуль SDRAM на 512M
и в нём с недавнего времени 11 бит (все в разных байтах) при чтении
всегда возвращают 0. Система (WinXP) всегда грузится, но 3-5
приложение (сверх автозапуска) уже попадает в эти битые области и
вылетает. Реально ли выделить память поверх них (скажем,
невыгружаемую, непермещаемую - этого, кстати, хватит?)? И в какую
сторону копать? VirtualAlloc, кажется, не подходит (я других функций,
которые могут указать нужный мне адрес, не знаю) или для него нужно
устанавливать атрибуты дополнительно? Если да, то чем? Sorry, за
длинный вопрос.
Отправлен: 23.04.2005, 19:42
Вопрос задал: gpakoh (статус: Посетитель)
Всего ответов отправлено: 1
Отвечает: _vt
Здравствуйте, gpakoh! Насколько я помню, существовали программы, которые как-то помечали битые ячейки памяти, после чего проблемы все решались. Но эти программы были очень давно, и я не знаю, будут ли они рабопособны с SDRAM-памятью, но попробуй все же поискать. То, что пытаешься сделать ты - мне кажется слишком ненадежно... --
* In Gates we trust! :)
Ответ отправил: _vt (статус: Академик)
Отправлен: 25.04.2005, 15:13
Вопрос № 20161
Я тут задавал вопрос про массивы(номер 20130). Получил ответ (спасибо Евгению Иванову). Как я понял этот ответ относится к программированию в среде Windows. Хотелось бы получить ответ, относительно программирования под DOS (с использованием TASM).
Отправлен: 24.04.2005, 00:59
Вопрос задал: VBA (статус: 1-ый класс)
Всего ответов отправлено: 2
Отвечает: Стас
Здравствуйте, mycatismurzik!
Все тоже самое.
Для выделения памяти исползуется ah=48h int21h bx- колво параграфов. (параграф - 16 байт). AX - код ошибки если CF, BX-доступно.
если нет ошибки AX - сегмент выделенного блока.
Высвобождение - ah=49h int21h es-сегментный адрес блока. AX - код ошибки если CF.
Перераспределение ah=4ah int21h es-сегментный адрес блока, bx - желаемый размер в параграфах. AX - код ошибки если CF, BX - наибольший доступный блок.
Ответ отправил: Стас (статус: Практикант)
Отправлен: 25.04.2005, 03:37
Отвечает: Ayl
Здравствуйте, mycatismurzik!
Позволю себе дополнить ответ Стаса.
В случае, если твоя программа имеет тип COM, то при ее запуске система отдает все доступную в данный момент память твоей программе. Соответственно, при попытке выделить блок памяти ты автоматом получишь сообщение о нехватке памяти в системе.
Чтобы этого избежать тебе нужно вначале освободить неиспользуемую память:
mov es, cs
mov bx, 4096 ; 4К параграфов, т.е. 64К памяти, т.е. 1 сегмент оставляем нашей программе
mov ah, 4ah
int 21h
Т.о. после выполнения этого фрагмента твоя программа будет занимать ровно 1 сегмент в памяти, а вся оставшаяся память будет доступна для использования.
P.S. Оставлять меньше 1 сегмента для программы проблематично, т.к. стек при запуске программы устанавливается на конец сегмента. Чтобы его перенести нужно в программе выделить соответствующий блок памяти и установить указатель стека в его конец:
my_stack dw 1023 dup (0)
STACK_START EQU $
dw (0)
и тогда в программе написать:
mov sp, STACK_START
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 25.04.2005, 16:54