Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [lol.com]блок памяти


Автор: wolf_f 26.10.2008, 16:45
  У меня дано вот такое задание: Я непрошу его решать, а просто объяснить, что из чего вычесть чтоб получить адреса блоков памяти!

Для выполнения данного задания используется компьютер с операционной системой Windows XP (Pro, SP2). Вся работа ведется в единственной запущенной виртуальной машине MS-DOS.
Программа LOL.com выдала адрес системной «таблицы таблиц» - List of list location: 00A7:0026H. Указатель на первый блок управления памятью будет содержаться в ячейках: 00A7:0026H. Проследим цепочку блоков управления памятью с помощью программы PEEK.com:
║00A7:0026│ EC 15 A7 00 CE 00 A7 00   5A 00 70 00 24 00 70 00 │ь.з.╬.з.Z.p.$.p.║
║00A7:0036│ 80 00 00 00 00 00 00 00   2A 04 00 00 20 04 00 00 │А.......*... ...║
║00A7:0046│ 07 07 00 00 E2 02 04 80   C6 0D CC 0D 4E 55 4C 20 │....т..А╞.╠.NUL ║
Учитывая, что младший байт находиться перед старшим в памяти при работе с процессорами архитектуры Intel x86, получаем адрес первого блока управления памятью:
║0320:0000│ 26 3B 77 02 76 08 03 D6   26 8B 77 02 2B D6 26 8B │&;w.v..╓&Лw.+╓&Л║
║0320:0010│ 47 02 26 03 47 04 2B C2   2B C6 76 02 03 D0 26 C6 │G.&.G.+┬+╞v..╨&╞║
Для получения последующих блоков памяти надо к адресу начала фрагмента памяти прибавить его величину, хранимую в третьей и четвертой ячейке блока управления памятью, признаком последнего блока в цепочке блоков управления памятью является символ “Z” в первом байте блока. Проследим всю цепочку:

Автор: Evjeny 27.10.2008, 14:51
Во-первых, вычитать ничего не надо, надо складывать  smile

Во-вторых, ты же сам уже ответил на свой вопрос:
Цитата(wolf_f @  26.10.2008,  16:45 Найти цитируемый пост)
Для получения последующих блоков памяти надо к адресу начала фрагмента памяти прибавить его величину, хранимую в третьей и четвертой ячейке блока управления памятью, признаком последнего блока в цепочке блоков управления памятью является символ “Z” в первом байте блока.


Т.е по шагам:

1. Получаем адрес векторной таблицы связи - List of list location. 00A7:0026H
2. Для получения адреса первого блока MCB надо из смещения 0026h вычесть 2. Таким образом сегментный адрес первого MCB будет находиться по адресу 00A7:0024h. Размер сегментного адреса 2 байта. Допустим по адресу 00A7:0024h будет находится 02 01. Учитывая, что младший байт располагается по младшему адресу, получаем адрес первого блока MCB - 0102:0000h.
3. Анализируем первый байт MCB, если он равен 'Z', то блок последний, и мы заканчиваем вычисления, если 'M', то блок промежуточный, переходим к следующему шагу.
4. Берем значение, имеющее смещение +3 байта от начал блока MCB, которе содержит размер блока памяти в параграфах (1 парграф = 16 байт). Умножаем это значени на 16 - получаем число байт, занимаемое этим блоком памяти.
5. Переходим на начало самого блока памяти (чтобы попасть на начало блока памяти надо к адресу MCB прибавить 16 байт - размер MCB), и прибавляем к нему полученное в пункте 4 значение. В результате получаем адрес следующего блока MCB. Возвращаемся на пункт 3.

Автор: wolf_f 27.10.2008, 20:00
Чет сделал адрес первого блока управления памятью 00A7:0024, а мне пишут что найдено неправильно smile !! Ни че непойу как так??? smile 



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)