ВЫВОД СОДЕРЖИМОГО УЧАСТКА ПАМЯТИ НА ЭКРАН ДИСПЛЕЯ

Error message

Notice: Undefined index: add term path in hansel_get_breadcrumbs() (line 524 of /data/sites/msdosworld.ru/www/sites/all/modules/hansel/hansel.module).

   Память компьютера представляет собой адресный массив.  ИНДИВИДУАЛЬНЫЙ
АДРЕС  обозначает  физическое  место  памяти,  в котором может храниться
наименьшая  единица  информации  (байт).  В  MS-DOS  память  делится  на
СЕГМЕНТЫ. Каждый  сегмент состоит  из 64  000 байт  (64 К), составляющих
один непрерывный участок  памяти. Индивидуальные адреса  внутри сегмента
отсчитываются от его начала. Такой способ адресации называется  короткой
адресацией, а адрес  байта - коротким  адресом. Если программа  занимает
менее одного  сегмента памяти,  то при  обращении к  различным элементам
программы опеpационная система  использует короткую адресацию.  Короткий
адрес первого байта сегмента - 0, второго - 1 и т.д. Длинный адрес байта
состоит из номера (адреса) сегмента и номера байта внутри сегмента  (его
короткого адреса). То есть каждый  байт памяти имеет длинный и  короткий
адрес. Теперь, зная о  строении памяти и способах  адресации, рассмотрим
действие команды DUMP (выдать содержимое участка памяти).
   Команда DUMP (d или D)  служит для отображения на экране  содержимого
участка памяти.  Полученный кусочек  памяти -  дамп, представляет  собой
последовательность значений байтов в шестнадцатеричном пpедставлении,  а
также - в коде ASCII. Стартуем дебаггер:
   C>debug
   -

   Напомним,  что  дефис  -  это  стандартный запрос дебаггера (сигнал о
готовности  пpинять  команду).  В  некоторых системах запросом дебаггеpа
является знак больше (>). Введем "d" и рассмотрим реакцию дебаггера:

 


   C>debug
   -d

958:100 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
958:110 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
958:120 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
958:130 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
958:140 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
958:150 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
958:160 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
958:170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................


ПРИМЕЧАНИЕ. Из-за того, что длинный адрес байта не помещается в строку,
            в примерах он иногда изображается без ведущих нулей. На
            самом деле под адрес сегмента и коротктй адрес байта
            отводится по 4 позиции. Например, вместо 958:100 в
            действительности на экpан выводится 0958:0100. В тексте же
            адреса приводятся так, как они реально изображаются на
            экране.

   Первое число в верхнем левом углу экрана (0958:0100) - это  начальный
адрес дампа. Адрес  читается следующим образом:   "сегмент номер  0958Н,
номер байта внутри сегмента 0100Н". При введении тех же команд на  вашей
машине, на экране могут появиться другие адpесные значения.
   Первые два нуля, следующие за адресом, означают, что значение байта с
адресом  0958:0100  равно  00Н.  Следующие  два  нуля  в  той  же строке
означают, что значение  байта с адресом,  на единицу больше  предыдущего
(0958:0101),  равно  00Н.  Из  рисунка  видно,  что общее число байтов в
строке  равно  16.  Значит,  16  последовательно  расположенных в памяти
байтов имеют одно и то же значение 00Н. При этом адрес начального  байта
в строке равен 0958:0100, адрес последнего - 0958:010F.
   Последующие  7  строк  (каждой  строке  предшествует  адрес первого в
строке  байта)  -  это  оставшаяся  часть  дампа.  Можно подсчитать, что
полученный дамп отображает содержимое 128 последовательно  расположенных
байтов. Начальный адрес дампа - 0958:0100, конечный - 0958:017F.
   Разделители в середине строки  - это ориентировочные точки.  8 байтов
из 16 находятся по одну сторону  от разделителя, 8 - по другую.  В конце
каждой  строки  находится  по  16  десятичных  точек.  Это пространство,
отведенное для представления данных  в коде ASCII. Значения,  не имеющие
символьного пpедставления в коде ASCII, обозначаются десятичной  точкой.
В этой части  экрана находятся только  точки, поскольку в  коде ASCII не
существует печатных символов со значением 00Н.
   Введем команду DUMP еще раз:

   C>debug
   -d

958:180 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
958:190 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
958:0A0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
958:1B0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
958:1C0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
958:1D0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
958:1E0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
958:1F0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

    Снова экран заполнили нули и десятичные точки. Но обратим внимание на
адресную  часть!  Этот  дамп  началася  с  того  места,  где  закончился
предыдущий.
   Если  вводить  команду  "d"  не  указывая  параметров,  DEBUG   будет
последовательно выводить по 128  байтов памяти. То есть  начальный адрес
дампа будет на единицу  превышать конечный адрес дампа,  полученного при
введении   предыдущей   команды   "d".   Если   команда   "d"   вводится
пеpвоначально,  то  дамп  выводится,  начиная  с адреса, по котоpому был
загружен   обрабатываемый   файл.      (Более   подробно   см."Детальное
рассмотрение DEBUG").
   В командной стpоке можно указать начальный адрес дампа. Он состоит из
адреса сегмента и  адеса байта внутpи  этого сегмента, т.е.  указывается
длинный адрес байта.  Эти два числа  разделяются двоеточием. Выведем,  к
примеру,  128  байтов  памяти,  начиная  с  байта  0000Н, находящегося в
сегменте 0958Н:
 

 


   -d 0958:0000

958:000 CD 20 00 20 00 9A EE FE-1D F0 34 02 68 06 62 20 M . ..n .p4.h.b.
958:010 68 06 E2 04 9C 05 9C 05-01 01 01 00 02 FF FF FF h.b.............
958:020 FF FF FF FF FF FF FF FF-FF FF FF FF 65 06 BC 2A ............e.<*
958:030 68 06 00 00 00 00 00 00-00 00 00 00 00 00 00 00 h...............
958:040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
958:050 CD 21 CB 00 00 00 00 00-00 00 00 00 00 20 20 20 M!K..........
958:060 20 20 20 20 20 20 20 20-00 00 00 00 00 20 20 20         .....
958:070 20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00         ........

    Отметим,  что  дамп  начинается  с  указанного  адреса. Выводятся 128
последовательно расположенных ячеек памяти. На этот раз дамп содержит не
только  нули  и  десятичные  точки.  Значение  первого  байта (с адресом
0958:0000), например, равно CDH.
   Числа, не имеющие символьного пpедставления в коде ASCII, расположены
в интервале значений  от 00Н до  7FH (см.приложение F).   DEBUG вычитает
80Н из любого значения, превышающего 7HF. Полученная разность  выводится
на экран в коде ASCII.  CDH  минус 80H равно 4DH. В коде ASCII  значение
4DH  соответствует  букве  "M".  Поэтому  в  правой  части экрана первым
символом является "M".  Значение второго байта  равно 20Н. В  коде ASCII
оно соответствует пробелу. Поэтому в правой части экрана вторым символом
выводится  пробел.  Значение  третьего  байта  -  00Н. Как мы знаем, это
непечатаемый символ кода ASCII. Поэтому третьим символом в правой  части
является десятичная точка.
   Полученный  блок  памяти  не  представляет  особого интереса, так как
состоит  из  не  связанных  между  собой  символов  и  десятичных точек.
Попробуем найти  что-нибудь более  осмысленное. Для  этого на  некоторое
время оставим дебаггер  и вернемся в  MS-DOS. Чтобы выйти  из дебаггера,
вводится команда "q":

         -q
         C>

   Так как на экране  стандартный системный запрос, можно  предположить,
что  мы  находимся  в  MS-DOS.  Теперь  воспользуемся EDLIN и организуем
какой-нибудь   текстовый  файл  (см.гл.7).  Если  вы  незнакомы с EDLIN,
то просто следуйте нашим инструкциям.
   Пусть файл займет  на диске около  250 байтов. Запишем  его в рабочий
директорий диска C. Введем команду:

         C>edlin dbugpro.txt

   Команда загружает  EDLIN и  создает файл  dbugpro.txt.   EDLIN выдает
сообщение:

         New file
         *
  Файл оpганизован.  EDLIN  готов принять следующую команду.  Введем Li
(или li)  и затем  - текст  нашего файла,  нажимая Enter  в конце каждой
строки. Введем 5 строк и нажмем Ctrl-Z:
 

 

         C>edlin dbugpro.txt
         New file
         *Li
   1:*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   2:*This text file will be used to demonstrate DEBUG.
   3:*The file will be loaded into memory when DEBUG is started.
   4:*DEBUG is easy to use after some practice.
   5:*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   6:*^Z
         e*           <---- Наберите "е"
         C>


   Для  выхода  из  EDLIN  вводится  команда  "е".  Системный  запрос C>
означает, что управление возвpащено MS-DOS. Файл dbugpro.txt оpганизован
и находится на диске C. Войдем в дебаггер, чтобы просмотреть только  что
созданный файл. Введем команду:

         C>debug dbugpro.txt
         -

   Дефис - стандартный запрос дебаггера, следовательно, программа  DEBUG
и файл  dbugpro.txt загружены  в память  машины. Чтобы  вывести на экран
содержимое файла, введем:

 

    -d

958:100 2B 2B 2B 2B 2B 2B 2B 2B-2B 2B 2B 2B 2B 2B 2B 2B ++++++++++++++++
958:110 2B 2B 2B 2B 2B 2B 2B 2B-2B 2B 2B 2B 2B 2B 2B 2B ++++++++++++++++
958:120 2B 2B 2B 2B 2B 2B 2B 2B-2B 2B 2B 2B 2B 2B 2B 2B ++++++++++++++++
958:130 2B 2B 2B 2B 2B 2B 2B 2B-2B 0D 0A 54 68 69 73 20 +++++++++..This
958:140 74 65 78 74 20 66 69 6C-65 20 77 69 6C 6C 20 62 text file will b
958:150 65 20 75 73 65 64 20 74-6F 20 64 65 6D 6F 6E 73 e used to demons
958:160 74 72 61 74 65 20 44 45-42 55 47 2E 0D 0A 54 68 trate DEBUG...Th
958:170 65 20 66 69 6C 65 20 77-69 6C 6C 20 62 65 20 6C e file will be l
   -

    Чтобы получить еще одну порцию дампа, повторно введем команду d:

   -d

958:180 6F 61 64 65 64 20 69 6E-74 6F 20 6D 65 6D 6F 72 oaded into memor
958:190 79 20 77 68 65 6E 20 44-45 42 55 47 20 69 73 20 y when DEBUG is
958:0A0 73 74 61 72 74 65 64 2E-0D 0A 44 45 42 55 47 20 started...DEBUG
958:1B0 69 73 20 65 61 73 79 20-74 6F 20 75 73 65 20 61 is easy to use a
958:1C0 66 74 65 72 20 73 6F 6D-65 20 70 72 61 63 74 69 fter some practi
958:1D0 63 65 2E 0D 0A 2B 2B 2B-2B 2B 2B 2B 2B 2B 2B 2B ce...+++++++++++
958:1E0 2B 2B 2B 2B 2B 2B 2B 2B-2B 2B 2B 2B 2B 2B 2B 2B ++++++++++++++++
958:1F0 2B 2B 2B 2B 2B 2B 2B 2B-2B 2B 2B 2B 2B 2B 2B 2B ++++++++++++++++
   -

  Напомним,  что  команда  d  выводит  на  экран 128 значений. В центре
экрана  находится  содержимое  файла  dbugpro.txt  в   шестнадцатеричном
пpедставлении, в правой его части - содеpжимое файла в коде ASCII.
   Начальный и конечный адреса дампа можно опpеделить следующим образом:


 


   Этот  дамп  начинается  с  байта  0958:01AA  и  заканчивается  байтом
0958:01D2. Начальный и конечный адреса вводятся в командной стpоке DUMP.
Отметим,  что   начальный  адрес   представлен  длинным   адресом  байта
(0958:01AA), а конечный - коротким (01D2).
   Если  адрес  сегмента  находится   в  одном  из  регистров   сегмента
(см.подраздел  "Регистры  и  флаги"  в  разделе  "Детальное рассмотрение
DEBUG"),  то  вместо  него  в  командной  строке можно указать имя этого
регистра. Введем  команду (начальный  и конечный  адреса участка  памяти
определены следующим  образом:   адрес сегмента  записан в  регистре DS;
короткий адрес первого байта равен 01AAH, последнего - 01D2H):

    -d DS:01AA 01D2

958:1AA 44 45 42 55 47 20                               DEBUG
958:1B0 69 73 20 65 61 73 79 20-74 6F 20 75 73 65 20 61 is easy to use a
958:1C0 66 74 65 72 20 73 6F 6D-65 20 70 72 61 63 74 69 fter some practi
958:1D0 63 65 2E                                        ce.
   -

   То  есть,  в  случае  запоминания  адреса  сегмента в регистре, можно
пользоваться  короткой  адресацией.  При  введении  "dump"  с  короткими
адресами, дебаггер считает, что адрес сегмента находится в регистре DS:

   -d 01AA 01D2

958:1AA 44 45 42 55 47 20                               DEBUG
958:1B0 69 73 20 65 61 73 79 20-74 6F 20 75 73 65 20 61 is easy to use a
958:1C0 66 74 65 72 20 73 6F 6D-65 20 70 72 61 63 74 69 fter some practi
958:1D0 63 65 2E                                        ce.
   -

   И наконец, вместо конечного адреса можно указать количество выводимых
байтов.  Вслед  за  начальным  адресом  набирается  заглавная L и число.
Выведем, например, 41 байт (29Н):

    -d DS:01AA L29

958:1AA 44 45 42 55 47 20                               DEBUG
958:1B0 69 73 20 65 61 73 79 20-74 6F 20 75 73 65 20 61 is easy to use a
958:1C0 66 74 65 72 20 73 6F 6D-65 20 70 72 61 63 74 69 fter some practi
958:1D0 63 65 2E                                        ce.
   -
Вы находитесь в разделе: 

Добавить коментарий