ПОЗНАВАТЕЛЬНОЕ Сила воли ведет к действию, а позитивные действия формируют позитивное отношение Как определить диапазон голоса - ваш вокал
Игровые автоматы с быстрым выводом Как цель узнает о ваших желаниях прежде, чем вы начнете действовать. Как компании прогнозируют привычки и манипулируют ими Целительная привычка Как самому избавиться от обидчивости Противоречивые взгляды на качества, присущие мужчинам Тренинг уверенности в себе Вкуснейший "Салат из свеклы с чесноком" Натюрморт и его изобразительные возможности Применение, как принимать мумие? Мумие для волос, лица, при переломах, при кровотечении и т.д. Как научиться брать на себя ответственность Зачем нужны границы в отношениях с детьми? Световозвращающие элементы на детской одежде Как победить свой возраст? Восемь уникальных способов, которые помогут достичь долголетия Как слышать голос Бога Классификация ожирения по ИМТ (ВОЗ) Глава 3. Завет мужчины с женщиной 
Оси и плоскости тела человека - Тело человека состоит из определенных топографических частей и участков, в которых расположены органы, мышцы, сосуды, нервы и т.д. Отёска стен и прирубка косяков - Когда на доме не достаёт окон и дверей, красивое высокое крыльцо ещё только в воображении, приходится подниматься с улицы в дом по трапу. Дифференциальные уравнения второго порядка (модель рынка с прогнозируемыми ценами) - В простых моделях рынка спрос и предложение обычно полагают зависящими только от текущей цены на товар. | Задание на выполнение работы ЛАБОРАТОРНАЯ РАБОТА N3 Изучение команд передачи данных. Основы работы с турбо отладчиком Цель работы Практическое освоение основных функций TURBO DEBUGGER. 2. Рекомендуемая литература К. Г. Финогенов. Основы языка Ассемблера. – М.: Радио и связь, 2000. с. 40…50. Белецкий Я. Энциклопедия языка Си: Пер. c польск.-М.:Мир,1992. с 347…408. Подготовка к работе 3.1. Изучить методические указания и рекомендованную литературу. 3.2. Подготовить ответы на контрольные вопросы. 4. Контрольные вопросы 4.1. Как записываются общие команды передачи данных на Ассемблере? Что может использоваться в качестве операндов команды? 4.2. Для чего предназначена команда LEA и что является ее операндами? 4.3. Поясните выполнение команд работы со стеком. 4.4. Поясните выполнение команды обмена данными. 4.5. Для чего предназначен отладчик Turbo Debugger? 4.6. Объясните смысл пунктов Главного меню в верхней строке отладчика. 4.7. Как загрузить отлаживаемую программу? 4.8. Какие окна можно открыть из пункта Главного меню View ? 4.9. Из каких фрагментов состоит окно CPU? 4.10. Что такое локальное меню окна и как его открыть? 4.11. Какие функции обеспечивает фрагмент кода (CODE) окна CPU? 4.12. Какие функции обеспечивает фрагмент памяти окна CPU? 4.13. Какие функции обеспечивает фрагмент регистров окна CPU? 4.14. Какие функции обеспечивает фрагмент стека окна CPU? 4.15. Какие функции обеспечивает фрагмент флагов окна CPU? 4.16. Каким образом можно редактировать ассемблерную программу? 4.17. Как осуществляется изменение содержимого оперативной памяти и регистров средствами отладчика? 4.18. Как через меню отладчика запустить программу на выполнение? 4.19. В каком окне можно наблюдать результат выполнения программы? 4.20. Что такое трассировка программы и как она осуществляется в отладчике? Задание на выполнение работы 5.1. Используя текстовый редактор, создайте исходный модуль программы Prog_3 с помощью шаблона, приведенного ниже. Начальные значения переменных A, B, C, D взять из таблицы 3.1 в соответствии с вариантом. Добавьте в исходный модуль недостающие комментарии. Таблица 3.1 Вариант | A | B | C | D | Вариант | A | B | C | D | | 5Ah B5h 22h 7h | 55h 1Ah 1Eh 2Eh | 2Eh 1Fh 1Dh 18h | AAh 22h | | 22h 3Bh 3Bh 12h | C1h 1Fh 1Ch | 9h 12h 10h 05h | eh 10h 0Fh 10h | ;Program_3 – Команды передачи данных, вариант 16 | Data SEGMENT | ; Открыть сегмент данных | | A DB ? | ; Зарезервировать место | | B DB ? | ;в памяти для | | C DB ? | ;переменных | | D DB ? | ;A, B, C, D | | Data ENDS | ; Закрыть сегмент данных | | Ourstack SEGMENT Stack | ; Открыть сегмент стека | | DB 100h DUP (?) | ; Отвести под стек 256 ; байт | | Ourstack ENDS | ; Закрыть сегмент стека | | ASSUME CS:Code, DS:Data, SS:Ourstack | ;Назначить сегментные | | | ; регистры | | Code SEGMENT | ;Открыть сегмент кодов | | Start: mov AX, Data | ;Инициализировать | | mov DS, AX | ;сегментный регистр DS | | mov A, 9 | ;инициализировать | | mov B, 1Ch | ;переменные A, B, C, D | | mov C, 8 | ;значениями Вашего | | mov D, 10h | ;варианта | | mov AL, A | | | mov AH, B | | | xchg AL, AH | | | mov BX, 3E10h | | | mov CX, BX | | | push BX | | | push CX | | | lea SI, C | | | mov AX, SI | | | lea DI, D | | | mov BX, DI | | | pop CX | | | pop BX | | | pop AX | | | mov A, AL | | | mov B, AH | | | mov C, 0 | | | mov AX, 4C00h | ;Завершить программу | | int 21h | ; с помощью DOS | | Code ENDS | ; Закрыть сегмент кодов | | END Start | ; Конец исх. модуля. | | 5.2. Создайте исполняемый модуль программы Prog_3.exe выполнив этапы ассемблирования и компоновки. 5.3. Запустите программу TD на выполнение. После появления визитной карточки отладчика нажмите клавишу ENTER. Обратите внимание на то, что в нижней строке расположена подсказка о назначении функциональных клавиш, в верхней строке перечислены меню отладчика. Через меню View перейдите в окно CPU(ЦП). Клавишей ZOOM измените размер открытого окна. 5.4. Обратите внимание на то, что окно CPU разделено рамками на фрагменты (внутренние окна), относящиеся к сегментам кода, данных, стека,а также крегистрамифлагам. В окне кода команда по смещению, равному содержимому регистра IP, а в окне стека данные по смещению, равному содержимому регистра SP, отмечены стрелками. Переход из одного внутреннего окна в другое производится клавишей <TAB> . 5.3. Нажатием комбинации клавиш <Alt>+<F10>, попробуйте открыть окна локальных меню в каждой фрагменте окна CPU,предварительно сделав их активными. Ознакомьтесь с их содержанием. Закрывайте окна клавишей <ESC>. 5.5. Используя клавишу <F10>, перейдите в главное меню. Откройте окно FILE. Включите режим OPEN... . Клавишей <TAB> выделите окно FILES. Курсорными клавишами выберите имя файла Prog_3.exe и загрузите его[1]. Сравните информацию, содержащуюся во фрагменте кода с листингом вашей программы. 5.6. В окне CPU произведите трассировку программы (пошаговое выполнение) нажатием клавиши <F8>. На каждом шаге контролируйте содержимое регистров, флагов и состояние стека. Заполните таблицу 3.3 в соответствии с вариантом задания (таблица 3.2). 5.7. Заново загрузите программу Prog_3 в отладчик. Начните трассировку программы. После инициализации сегментных регистров зафиксируйте их содержимое и составьте модель размещения программы в памяти ЭВМ (см. лабораторную работу №2). 5.8. Определите начальные и конечные адреса сегмента данных, сегмента стека и сегмента кодов. Вычислите длину сегмента данных и сегмента кодов программы в байтах. Проанализируйте файл Prog_3.map и сравните результаты Ваших вычислений с цифрами, приведенными в этом файле. 5.9. Просмотрите и зарисуйте область памяти, в которой хранятся данные, объявленные в сегменте данных программы (дамп памяти). 5.10. Загрузите в отладчик программу hello_2.exe.Выполняя еев пошаговом режиме, заполнить таблицу 3.3 в соответствии с вариантом задания (Таблица 3.2). После завершения программы перейдите в окно WINDOW главного меню и установите режим USER SCREEN. Убедитесь, что программа выполнила свою задачу. Клавишей ESC верните изображение окна CPU. 5.11. Выполните пункты 5,7, 5.8 и 5.9 для программы hello_2.exe. 5.12. Прочитайте в трех ячейках памяти начиная с адреса F000:FFF5 дату выпуска ПЗУ BIOS в формате месяц/число/год. 5.13. Прочитайте в памяти по адресу F000:FFFE однобайтовый идентификатор модели ЭВМ. 5.14. Отчитайтесь о проделанной работе. 5.15. Составьте отчет, который должен содержать: - листинг программы Prog_3 с комментариями; - таблицу 3.3 с результатами исследования отладки программы; - рисунки образов программ Prog_3 и Hello_2 в памяти ЭВМ (п.5.7); - данные файлов *.map и вычисленные начальные и конечные адреса сегментов программы и их длины (п.5.8); - рисунки областей памяти с хранящимися данными (п.5.9); - дату выпуска ПЗУ и идентификатор ЭВМ (п.5.12, 5.13). Таблица 3.2. № варианта | строки Prog_3 | строки HELLO_2 | № варианта | строки Prog_3 | строки HELLO_2 | | 1, 2,10,11 | 9,10 | | 2, 3,12, 13 | 6, 7 | | 2, 3, 9, 10 | 8, 9 | | 3, 4, 11, 12 | 5, 6 | | 3, 4,13, 14 | 7, 8 | | 4, 5, 14, 15 | 4, 5 | | 4, 5, 15, 16 | 6, 7 | | 5, 6, 16, 17 | 3, 4 | | 5, 6, 17, 18 | 5, 6 | | 6, 7, 18, 19 | 2, 3 | | 6, 7, 19, 20 | 4, 5 | | 7, 8,20, 21 | 1, 2 | | 7, 8, 21, 22 | 3,4 | | 1, 2, 22, 23 | 6, 7 | | 1, 2, 23, 24 | 7, 8 | | 1, 2, 3, 4 | 9, 10 | Таблица 3.3 Вариант 16 | № строки | Команда Ассембл-ера | Машин-ный код | Длина машин-ного кода | Логичес-кий адрес в памяти | Физичес-кий адрес в памяти | Состояние регистров и флагов | Prog_3 | | | | | | AX=,BX=,CX=, DX=,SP=,BP=, SI=,DI=,IP=,DS=, SS=,CS=,ES=, CF=,ZF=,SF=, OF=,PF=,AF= | | | | | | | AX=,BX=,CX=, DX=,SP=,BP=, SI=,DI=,IP=,DS=, SS=,CS=,ES=, CF=,ZF=,SF=, OF=,PF=,AF= | Hello_2 | | | | | | AX=,BX=,CX=, DX=,SP=,BP=, SI=,DI=,IP=,DS=, SS=,CS=,ES=, CF=,ZF=,SF=, OF=,PF=,AF= | | | | | | | AX=,BX=,CX=, DX=,SP=,BP=, SI=,DI=,IP=,DS=, SS=,CS=,ES=, CF=,ZF=,SF=, OF=,PF=,AF= | Общие сведения 6.1.Команды передачи данных (команды пересылок) предназначены для организации пересылки данных между регистрами, регистрами и памятью, памятью и регистрами, а также для загрузки регистров или ячеек памяти данными. При выполнении команд передачи данных флаги не устанавливаются. Наиболее часто используются общие команды передачи данных: MOV dst, src; dst:= (src). Команда осуществляет передачу содержимого источника (src) в получатель (dst). Операндами этой команды могут быть: - регистр – регистр; - регистр – память; - память – регистр; - регистр – непосредственные данные; - память – непосредственные данные. Команда обмена данными позволяет обменивать содержимое любого общего регистра и ячейки памяти, либо любой пары общих регистров: XCHG op1, op2; op1:= (op2), op2:= (op1). Использование сегментных регистров в командах обмена запрещается. Команда загрузки исполнительного адреса загружает в регистр, указанный в качестве первого операнда, относительный адрес второго операнда, который находится в памяти: LEA reg, mem; reg:= [mem]. Не допускается использование сегментных регистров. Команды работы со стеком используются для занесения данных в стек и извлечения данных из стека. Для адресации к вершине стека используется регистр указателя стека SP, который при выполнении стековых команд автоматически модифицируется. Все стековые команды манипулируют только двухбайтовыми данными – словами. PUSH src; SP:= (SP) – 2 , [(SP)]:= (src). Эта команда PUSH - поместить в стек. Она уменьшает на 2 содержимое указателя стека SP и заносит на вершину стека по этому адресу двухбайтовый операнд, указанный в команде. В качестве операнда может использоваться любой 16 разрядный регистр или двухбайтовая ячейка памяти. Команда извлечь из стека имеет формат POP dst; dst:= [(SP)], SP:= (SP) + 2. Команда извлекает 16 разрядные данные из ячеек стека, на которые указывает указатель SP и помещает их в получатель, указанный в команде. Содержимое SP при этом автоматически увеличивается на 2. 6.2. Турбо отладчик (Turbo Debugger) - это современный отладчик, позволяющий отлаживать программы на уровне исходного текста и предназначенный для программистов, работающих на Турбо языках фирмы Borland. Многочисленные перекрывающие друг друга окна, а также сочетание спускающихся и раскрывающихся меню обеспечивают быстрый, интерактивный пользовательский интерфейс. Интерактивная, контекстно-зависимая система подсказки обеспечит вас подсказкой на всех стадиях работы. Непосредственно после запуска отладчика на экране появится кадр в котором видны два окна – окно Module с исходным текстом отлаживаемой программы и окно Watches для наблюдения за ходом изменения заданных переменных в процессе выполнения программы.  Рис. 3.1. Начальный кадр отладчика с текстом отлаживаемой программы. Начальное окно отладчика дает мало информации для отладки программы. В нем можно выполнить программу по частям до местоположения курсора (клавиша <F4>) и команда за командой (клавиша <F8>); можно также с помощью окна Watches наблюдать изменения заданных полей данных. Гораздо более информативным является «окно процессора», которое вызывается с помощью пукта View>CPU верхнего меню или командой <Alt>+<V>+<C> (рис 3.2).  Рис. 3.2. Окно процессора с внутренними окнами. В окне CPU (ЦП) показано все состояние центрального процессора. Это окно в свою очередь состоит, из 5 внутренних окон для наблюдения: - текста программы на языке ассемблера и в машинных кодах (сегмент кода); - регистров процессора; - флагов; - стека (сегмент стека); - содержимого памяти (сегмент данных). С помощью этих окон можно полностью контролировать ход выполнения отлаживаемой программы. Для того чтобы можно было работать с конкретным окном надо сделать его активным (клавиша <ТАБ>). В окне исходного текста или Code (Код) для временной коррекции своей программы можно использовать встроенный Ассемблер. Для этого нужно сделать окно активным, нажав <ALT>+<F10> и выбрать пункт локального меню Assembler. При этом инструкции вводятся точно также, как при наборе исходных операторов Ассемблера. Можно также получить доступ к соответствующим данным любой структуры данных, выводя и изменяя их в различных форматах. В области регистров (верхняя область справа от области кода) выводится содержимое регистров центрального процессора. При необходимости содержимое регистров можно изменять через локальное меню. Верхней правой областью является область флагов, где показано содержимое восьми флагов центрального процессора. Значения флагов также можно изменять через локальное меню. В нижнем правом углу окна CPU показано содержимое стека. Адрес входа в стек определяется содержимым регистров SS : SP. В области данных показано непосредственное содержимое выбранной области памяти. В левой части каждой строки показан логический адрес данных, выводимых на данной строке. Адрес выводится в виде пары SEG : EA. Значение SEG заменяется содержимым регистра DS, если значение сегмента совпадает с текущим содержимым регистра DS. В правой части каждой строки выводятся символы, соответствующие показанным байтам. Турбо отладчик выводит все печатаемые значения, соответствующие байтовым эквивалентам, поэтому не удивляйтесь, если на экране вы увидите странные символы - просто это символьный эквивалент шестнадцатеричных значений байтов данных. Для того чтобы вывести на экран что-либо иное, надо воспользоваться командой <Alt>+<F10>, которая для каждого внутреннего окна процессора открывает дополнительное меню. Вид этого меню зависит от того, какое окне было активным в момент ввода команды. На рис. 3.3 показано дополнительное меню окна дампа.  Рис. 3.3. Чаще всего приходится пользоваться первым пунктом этого меню Goto, с помощью которого можно задать любой адрес, и получить дамп этого участка. На рис. 3.4 изображено содержимое окна дампа после ввода начального адреса в виде DS:0  Рис. 3.4 [1] Приступая к работе с отладчиком, следует убедится, что в рабочем каталоге имеются и загрузочный (*.EXE), и исходный (*.ASM) файлы. |