Как заглянуть в любую ячейку памяти
В самом начале мы научились заглядывать в регистры памяти процессора, Мы можем заглянуть и в любую ячейку оперативной памяти, для этого нужно ввести команду d (ди, от слова dump — дамп). Давайте узнаем, что же хранится в ячейке 0dca:99.
Вводим команду d 0dca:99 и нажимаем Enter (после буквы d надо добавить пробел): screen 1.
1-я строка начинается с номера сегмента Odea и смещения 0090. Далее до интересующей нас ячейки 0dca:0099 идут пробелы, а в «нашей» ячейке обнаруживаем число аО. Машина выдала гораздо больше ячеек, а мы просили только одну ячейку 0dca:0099. Не зря, оказывается, команда называется dump — в переводе это мусорная куча!
Давайте узнаем, какая память доступна Дебаггеру.
Имеются хорошие справочники по оперативной памяти (так называемые карты памяти), где указываются части памяти, в которые при включении компьютера (то есть при «загрузке») записываются данные, необходимые для работы компьютера и программ. Сведения о памяти (о себе, любимой) записываются в сегмент с шестнад-цатеричным номером 00400. Первые два нуля можно отбросить, так что получится число 400. Компьютер их сам потом допишет по умолчанию.
Сведения об объеме доступной памяти компьютерный писарь заносит в ячейки 413 и 414. Так как 413 = 400+13 и414 = 400+14, то 400-номер сегмента, который записывается как 40 (последний нуль подразумевается), а 13 и 14 — соответствующие смещения. Получаем два косвенных адреса: 40:13 и 40:14.
Пользуясь Дебаггером, достаточно ввести первый из них, так как на нас все равно вывалят большущую кучу ячеек — дамп памяти.
Введем команду d 40:13 (и нажмем Enter).
В ячейках 0040:0013 и 0040:0014 содержатся нужные нам числа 80 и 02. В регистр они в таком виде и переписываются. Но вернитесь к таблице 1. Получится содержимое регистра 80 02. Так как нумерация 4-битовых частей регистра ведется справа налево, а нумерация ячеек памяти — слева направо, то числа 80 и 02 следует переписать в обратном порядке, получим шестнадцатеричное число 0280. В десятичном представлении получаем (воспользовавшись калькулятором, о котором писали в № 3) 640 килобайтов. На самом деле объем всей оперативной памяти компьютера, на котором набирается данный текст, намного больше. Но Дебаггеру достается не так уж и мало.
Мы теперь умеем заглядывать не только в регистры, но и в ячейки памяти.
Теперь вернемся опять к теме о том, как адресуются ячейки памяти. Мы можем посмотреть, как на самом деле содержимое памяти выводится на экран. Чтобы просмотреть «настоящую» память компьютера с самого начала, введем команду d 0:0.
Номер сегмента (если дописывать подразумеваемый ноль справа) здесь 00000, в следующей строке должен бы быть номер 00010, но дело в том, что строка состоит из ячеек со смещениями 0000,0001…..ffff- это 65536 ячеек в десятичной записи. Столько ячеек на экране не умещается, поэтому одну длинную строку выводят порциями из коротких «подстрочек», которые уже умещаются на экране.
Можно листать эту память, нажимая сколько угодно раз команду d. Можно почувствовать, насколько велик сегмент 00000 (пятый ноль в адре-
се не указан, там всего 4 нуля!). Когда вы доберетесь до конца сегмента, Дебаггер сам собой вернется в начало этого же сегмента. Аналогично можно просмотреть сегмент 00010 и т.д., насколько хватит терпения.
Действия с регистрами и ячейками памяти
До сих пор речь шла о знакомстве с некоторыми регистрами процессора и памятью компьютера.
Теперь посмотрим, как их можно использовать в программировании. Начнем с простого примера: сложим два числа. Как компьютер это делает? Нужно иметь в виду, что все действия совершает процессор! Основные события происходят в регистрах!
Кроме того, сами действия тоже кодируются с помощью нулей и единиц. Например, в шестнадцатерич-ном формате число Ь8 (т.е. 10111000) означает пересылку числа в регистр ах, команда 05 (т.е.00000101) означает сложение, команда cb (т.е. 11001011)- выход из Дебаггера.
Продемонстрируем пришедшим на чай гостям, что ваш компьютер, как и Вольф Мессинг, умеет складывать числа. Пусть они назвали, допустим, 15h и 27h (букву h приписывают справа для указания того, что число шестнадцатеричное).
Составим программу:
Ь8 15 00 05 27 00 cb
Для ввода полученных чисел в память добавляем еще кое-что, в результате нужно набрать следующее:
е cs:100 Ь8 15 00
е cs:103 05 27 00
е cs: 106 cb
Буква е означает, что ввод программы в оперативную память производится по команде е (читается «и-и-и!», от слова enter- «энтер»), компьютер далее сам ищет незаполненный сегмент и его номер записывает в регистр cs (это будет левая часть косвенного адреса). Смещение мы зададим вручную, например 100h. Сидящий внутри компьютера писарь записывает его в регистр ip (ай-пи). Сформированный относительный адрес выводится на экран и красиво оформляет приглашение к дальнейшему вводу.
Числа Ь8, 15 и 00 затаскиваются компьютерными полицейскими (шутка, их нет) в ячейки со смещениями 100, 101 и 102. Поэтому для следующей команды мы должны сами ввести смещение 103. Для третьей команды смещение должно быть равно 106 (screen 2).
Посмотрим, что получилось в регистрах: screen 3.
В регистр cs компьютерный писарь записал номер свободного сегмента 0b47h. Смещение величиной 100h надежно спряталось в регистре ip.
Пока в регистре ах все спокойно, там нулево.
Перейдем к выполнению программы. Для этого надо вводить команду t (читается «ти», от слова tracing — трассировка, пошаговое выполнение программы) до тех пор, пока не выполнится последняя команда: screen 4.
После первого раза в регистр ах запишется число 15h, после второго — число Зс — это ответ.
Все верно, т.к. 15h + 27h = Зс. Как потом рассказывал присутствовавший при этом артист, «публика неистовствовала…» Ура компьютеру.
Тут начинается ассемблер
При наборе программы сложения чисел пришлось держать справочник перед собой, так как числовой код Ь8 никак не похож на команду пересылки чисел в регистр, и ведь как можно помнить, что 05 означает сложение, и т.д. К тому же смещения подсчитыва-лись вручную!!! Поэтому мы должны сделать еще один шаг дальше (точнее, подняться на вторую ступеньку выше) от родного языка компьютера… Увы, не получается общение не только на двоичном языке, но и на шестнадцатеричном … Лучше всего заменить числовые коды команд словами, понятными человеку; это называется мнемоникой. Аналогично при пользовании мобильным телефоном вместо ручного набора 11 -значного номера мы выбираем в списке соответствующую мнемонику.
Правда, мнемонику впервые применили для упрощения своей работы англоговорящие программисты. В России программисты тоже пользовались мнемоникой — русской, и был русский ассемблер, т.н. ЯСК (язык символического кодирования), но он не выжил. Так что придется учить английский…
Например, числовой код Ь8 (т.е. 10111000) заменяется на mov
— это сокращение слова move (мув
— перемещение). Команды ассемблера всегда состоят из трех букв.
Тогда строчку Ь8 15 00 записываем иначе: mov ах, 15
Строка 05 27 00 принимает вид add ах,27
Команда cb (т.е. 11001011) заменяется на более понятное ret (от слова return — возврат, имеется в виду возвращение в среду DOS или Windows). Обозначение add происходит от слова addition (сложение) и читается «эд».
Кроме того, подсчет смещений поручим компьютеру. Так как мы это уже делали вручную, нам ясно, что это сводится к подсчету байтов и прибавлению полученного результата к предыдущему смещению. Поэтому команды вроде е cs: 100 тоже опускаются, нам они не нужны, но нужны компьютеру, а он сам их восстановит однозначно.
SP=EFEE BP=B000 SI=0fl00 01=0000 1Р=01Я6 MM UP EI PL NZ •’ — —
Screen 3
Что делать дальше?
Программа Дебаггер, которую мы использовали в книжке, является 16-битовой. Но в современных компьютерах процессоры помощнее, их регистры более вместительные, есть 32-би-товые, есть 64-битовые. При желании можно в Интернете найти 32-битовый Дебаггер, например, написанный японским программистом Takeshi Kataoka по адресу http://www.programmersheaven. com/download/26391 /Zipfilelist.aspx
Если захотелось узнать больше об ассемблере, то, значит, вы готовы стать программистом. Тогда на следующем этапе лучше всего добыть из Интернета по адресу http://www.emu8086.com/ эмулятор процессора 8086 со встроенным ассемблером. Очень полезная программа, у нее замечательный Help, но, к сожалению, на английском языке. Если постараться, то, наверное, в Интернете можно найти русский текст. Впрочем, если у человека мозги справляются с ассемблером, то с английским он тоже разберется. Для следующего этапа будет полезна книжка А.Б.Крупника «Изучаемассемблер».
Большие программы можно набрать в редакторе Блокнот, сохранить с расширением .asm, например file.asm. Придется ставить на компьютер еще одну программу, например, Майкрософт Ассемблер (MASM) 4-й версии и, для удобства, такую программу, как, например, Far Manager. Запустив Far Manager, набрать в его строке приглашения masm file.asm /I, будет сгенерирован листинг. Еще раз набираем masm file.asm, генерируется объектный файл file.obj. Чтобы получить исполнимый файл, набираем link file.obj. Получится файл с расширением .ехе. Конечно, последний абзац-темный лес. Впрочем, читайте указанную выше книжку…