Иванова Г.С., Ничушкина Т.Н. - Программирование на ассемблере MASM32 в среде RADAsm с использованием 32-разрядного отладчика OlleDBG (1075573), страница 2
Текст из файла (страница 2)
На этом этапе к объектному (двоичному) коду программы добавляются объектные коды используемых подпрограмм. Приэтом в тех местах программы, где происходит вызов процедур, указывается их относительный адрес в модуле. Сведения о компоновке также выводятся в окно Output:C:\Masm32\Bin\LINK.EXE /SUBSYSTEM:CONSOLE /RELEASE/VERSION:4.0 /LIBPATH:"C:\Masm32\Lib"/OUT:"Lab01.exe""Lab01.obj"Microsoft (R) Incremental Linker Version 5.12.8078Copyright (C) Microsoft Corp 1992-1998.
All rights reserved.Make finished.Total compile time 109 msПервая строка вывода также является командной строкой вызова компоновщикаC:\Masm32\Bin\LINK.EXE – полное имя компоновщика, за которым следуют опции:/SUBSYSTEM:CONSOLE – подключить стандартное окно консоли,/RELEASE – создать реализацию (а не отладочный вариант),/VERSION:4.0 – минимальная версия компоновщика,/LIBPATH:"C:\Masm32\Lib" – путь к файлам библиотек,/OUT:"Lab01.exe" – имя результата компоновки – загрузочного файлаОглавление10и параметр "Lab01.obj" – имя объектного файла.В следующих строках также возможны сообщения об ошибках. В основном в лабораторных работах вы будете получать сообщение о неразрешенных внешних ссылках,например:Lab01.obj:errorLNK2001:unresolvedexternalsymbol_ExitPro-cess@4Lab01.exe : fatal error LNK1120: 1 unresolved externalsMake error(s) occured.Как правило, такое сообщение говорит о наличии в программе вызовов процедур,для которых в указанных библиотеках не найдены коды.
В данном примере не подключена библиотека, в которой находится процедура ExitProcess.После устранения ошибки программу необходимо перетранслировать и зановоскомпоновать.Если процессы трансляции и компоновки прошли нормально, то ее можно запустить на выполнение. При этом открывается окно консоли, в которое выводится строказапроса (см.
рисунок 3).Рисунок 3 – Окно консолиОкно закрывается при нажатии клавиши Enter.Оглавление113. Создание простейшей программыДля изучения возможностей отладчика необходимо ввести программу, которая выполняет несколько простых команд, например, вычисляет результат следующего выражения:X=A+5-BДанные для программы зададим константами, поместив их описание в раздел инициированных данных:.DATAASDWORD-30BSDWORD21Для результата вычислений – переменной X – необходимо зарезервировать место,поместив описание соответствующейнеинициализированной переменной в разделнеинициализированных данных:.DATA?XSDWORD?Размещение неинициализированной переменной в этом разделе не обязательно, ноболее грамотно, поскольку неинициализированные переменные в образе исполняемойпрограммы на диске не хранятся, а размещаются при загрузке на выполнение.Фрагмент кода программы, выполняющей сложение и вычитание, необходимо поместить в сегменте кодов после метки Start:Start:movEAX,A ; поместить число в регистр EAXaddEAX,5;сложить EAX и 5, результат в EAXsubEAX,B ;вычесть B, результат в EAXmovX,EAX ; сохранить результат в памятиПоскольку программа ничего не выводит, результат операции следует посмотреть вотладчике.Оглавление124.
Просмотр выполнения программы в отладчикеДля запуска программы в режиме отладки следует последовательно инициироватьследующие пункты меню:•трансляцию Создать/Assemble,•компоновку Создать/Link,•запуск на выполнение в отладчике Создать/Run w/Debug.После запуска на экране появляется окно отладчика OlleDBG (см. рисунок 4).Рисунок 4 – Окно OlleDBGВ окне можно выделить четыре области:•дочернее окно CPU – окно процессора, в котором высвечиваются адреса команд,их шестнадцатеричные коды, результаты дисассемблирования и результаты выделенияпараметров процедур;•область Registers – окно содержимого регистров процессора,•окно данных, в котором высвечиваются адреса памяти (Address) и ее шестнадца-теричный (Hex dump) и символьный (ASCII) дампы;• окно стека, в котором показывается содержимое вершины стека.Оглавление13В исходный момент времени курсор находится в окне CPU, т.е.
программа готова квыполнению. Для выполнения команды отладчика используют следующие комбинацииклавиш:F7 – выполнить шаг с заходом в тело процедуры;F8 – выполнить шаг, не заходя в тело процедуры.Адрес начала программы 00401000h. К сожалению, отладчик не всегда правильнодисассемблирует двоичный код программы, и какие-то команды могут остаться не распознанными. Так на рисунке 4 видно, что команда mov X,EAX оказалась не распознанной.Вместо нее в отладчике указан код, соответствующий определению данных: DB A3 и т.д.Однако выполнение программы будет осуществляться правильно.Адрес начала раздела инициированных данных – 00403000h.
Каждое значениезанимает столько байт, сколько резервируется директивой. В отладчике каждый байтпредставлен двумя шестнадцатеричными цифрами. Кроме того, используется обратныйпорядок байт, т.е. младший байт числа находится в младших адресах памяти (перед старшим). Если шестнадцатеричная комбинация соответствует коду символа, то он высвечивается в следующем столбце (ASCII), иначе в нем высвечивается точка.Не инициированные данные располагаются после инициированных с адреса, кратного 16.При каждом выполнении команды мы можем наблюдать изменение данных в памяти и/или в регистрах, отслеживая процесс выполнения программы и контролируя правильность промежуточных результатов.Так после выполнения первой команды число A копируется в регистр EAX, который при этом подсвечивается красным.
При записи в регистр порядок байт меняется напрямой, при котором первым записан старший байт.Оглавление145. Описание данных в программе на ассемблереВсе данные, используемые в программах на ассемблере, обязательно должны бытьобъявлены с использованием соответствующих директив, которые определяют тип данных и количество байт, необходимое для размещения этих данных в памяти:[<Имя>] <Директива>[<Константа>DUP(]<Список инициализаторов>[)]где <Имя> – имя поля данных, которое может не присваиваться;<Директива> – команда, объявляющая тип описываемых данных (см.
таблицу 1);<Константа> DUP – используются при описании повторяющихся данных, тогдаконстанта определяет количество повторений;<Список инициализаторов> – последовательность инициализирующих констант через запятую или символ «?», если инициализирующее значение не определяется.Таблица 1 – Директивы определения данныхДирективаBYTE / SBYTEОписание типа данных8-разрядное целое без знака / со знакомWORD / SWORD16-разрядное целое без знака / со знакомDWORD / SDWORD 32-разрядное целое без знака / со знаком или ближний указательFWORD48-разрядное целое или дальний указательQWORD64-разрядное целоеTBYTE80-разрядное целоеREAL432-х разрядное короткое вещественноеREAL864-х разрядное длинное вещественноеREAL1080-ти разрядное расширенное вещественноеПримечание – В качестве директив также могут применяться:•DB – определить байт,•DW – определить слово,•DD – определить двойное слово (4 байта),•DQ – определить четыре слова (8 байт),•DT – определить 10 байт.В качестве инициализаторов при описании данных применяются:•целые константы [<знак>]<целое> [<основание системы счисления>],например:Оглавление15o-43236, 236d – целые десятичные числа,o23h, 0ADh – целые шестнадцатеричные числа (если шестнадцатеричнаяконстанта начинается с буквы, то перед ней указывается 0),o•0111010b – целое двоичное;вещественные константы [<знак>] <целое> .
[E|e [<знак>] <целое>],например: -2., 34E-28;•символы в кодировке ASCII (MS DOS) или ANSI (Windows) в апострофах или кавычках, например: 'A' или ″A″;•строковые константы в апострофах или кавычках, например, 'ABCD' или ″ABCD″.Примеры определения данных различных типов приведены далее.Оглавление16Задание1.Запустите RADAsm, создайте файл проекта по шаблону консольного приложе-ния.
Внимательно изучите структуру программы и зафиксируйте текст с комментариямив отчете.2. Запустите шаблон на выполнение и просмотрите все полученные сообщения.Убедитесь, что текст программы и настройки среды не содержат ошибок.3. Добавьте директивы определения данных и команды сложения и вычитания,описанные в разделе 3 настоящих методических указаний. Найдите в отладчике внутреннее представление исходных данных, зафиксируйте его в отчете и поясните.Проследите в отладчике выполнение набранной вами программы и зафиксируйте вотчете результаты выполнения каждой добавленной команды (изменение регистров, флагов и полей данных).4. Введите следующие строки в раздел описания инициированных данных и определите с помощью отладчика внутренние представление этих данных в памяти. Результаты проанализируйте и занесите в отчет.val1BYTE255chartWORD256lue3SWORD-128aluBYTE?v5BYTE10hBYTE100101BbetaBYTE23,23h,0chsdkBYTE″ Hello″ ,0minSWORD-32767arDWORD12345678hvalarBYTE5 DUP (1, 2, 8)5.
Определите в памяти следующие данные:а) целое число 25 размером 2 байта со знаком;б) двойное слово, содержащее число -35;в) символьную строку, содержащую ваше имя (русскими буквами и латинскимибуквами).Оглавление17Зафиксируйте в отчете внутреннее представление этих данных и дайте пояснение.6.Определите несколькими способами в программе числа, которые во внутреннемпредставлении (в отладчике) будут выглядеть как 25 00 и 00 25. Проверьте правильность ваших предположений, введя соответствующие строки в программу. Зафиксируйтерезультаты в отчете.7. Замените директивы описания знаковых данных на беззнаковые:ADWORD-30BDWORD21XDWORD?Запустите программу и прокомментируйте результат.8.Добавьте в программу переменную F1=65535 размером слово и переменную F2=65535 размером двойное слово. Вставьте в программу команды сложения этих чисел с 1:addF1,1addF2,1Проанализируйте и прокомментируйте в отчете полученный результат (обратитевнимание на флаги).Оглавление18Контрольные вопросы1.