Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Контроль переменных и данных различного типаСодержание книги
Поиск на нашем сайте
Окно Watch – очень полезный инструмент при отладке приложений. Оно позволяет наблюдать значения переменных в процессе выполнения программы. Для добавления новой переменной в окно Watch необходимо либо написать ее имя в пустой строчке, либо перетянуть мышкой из исходного файла в окно Watch. В окне Watch можно изменять интерпретацию типа данных переменной. Форматирующий символ там просто вводится сразу за именем переменной с разделительной запятой. Например, если hexNumber имеет значение 0x0041, а вы хотите видеть значение в символьной форме, в категории Name окна Watch введите hexNumber,c. Когда вы нажмете Enter, появится символьный формат значения: hexNumber,c = ‘A’. Форматирующие символы дисплея отладчика. Табл. 1.1.
Вы можете так же пользоваться форматирующими значениями для содержимого памяти в применении к любым выражениям, оцениваемым как адрес. Для представления массива символов в виде строки поставьте перед именем массива символ &, например, &ArrayName. Можно за выражением поставить форматирующий символ, например &ArrayName,x.
Варианты заданий В ходе выполнения данной лабораторной работы вам необходимо усвоить основные методы работы с отладчиком. Для этого вам предстоит построить консольное приложение Windows, в котором будут присутствовать следующие элементы. · Цикл. · Вызов функций (минимум два уровня вложенности). · Работа с char* строками. Используя построенное приложение, вам необходимо научиться использовать контрольные точки, обработку вызовов функций, просмотр и интерпретацию переменных как различных типов данных.
1.6. Контрольные вопросы 1. Какие существую проблемы в связи с ошибками? 2. Типы бывают типы ошибок, когда возникают? 3. Как к проекту подключаются дополнительные модули? 4. Как выполняется расшифровка сообщений об ошибках отладчика? 5. Как выполняется запуск отладчика. 6. Для чего предназначено меню Build и содержащиеся в нем команды? Привести краткое описание команд. 7. Для чего предназначена панель Debug и содержащиеся в ней команды? Привести краткое описание команд. 8. Какая информация отображается в окне Variables? 9. Какая информация отображается в окне Watch? 10. Какая информация отображается в окне Registers? 11. Какая информация отображается в окне Memory? 12. Какая информация отображается в окне Call Stack? 13. Какая информация отображается в окне Disassembly? 14. Как осуществляется форматирование представления переменных в окне Watch?
Лабораторная работа № 2 Отладка средствами ассемблера Порой необходимо отлаживать программу, когда отладочная информация недоступна. В таком случае возможна только отладка дизассемблированного кода. В данной лабораторной работе вам предстоит изучить методы отладки средствами ассемблера. Цель работы. Построить простейшее приложение, показать в окне отладчика дизассемблированный код, поставить в соответствие функциям С++ код ассемблера. Теоретические сведения Основные команды ассемблера. Ниже описаны все непривилегированные команды процессоров Intel серии х86, включая команды расширений IA NPX (чаще называемый FPU — расширение для работы с числами с плавающей запятой) и IA MMX (мультимедийное расширение). Для каждой команды указана форма записи, название и модель процессоров Intel, начиная с которой она поддерживается: 8086, 80186, 80286, 80386, 80486, Р5 (Pentium), MMX, P6 (Pentium Pro и Pentium II). Пересылка данных. Табл. 2..1.
Базовая команда пересылки данных. Копирует содержимое источника в приемник, источник не изменяется. Команда MOV действует аналогично операторам присваивания из языков высокого уровня, то есть команда mov ax,bxэквивалентна выражению ах:= bх; языка Паскаль или ах = bх; языка С, за исключением того, что команда ассемблера позволяет работать не только с переменными в памяти, но и со всеми регистрами процессора.В качестве источника для MOV могут использоваться: число (непосредственный операнд), регистр общего назначения, сегментный регистр или переменная (то есть операнд, находящийся в памяти). В качестве приемника — регистр общего назначения, сегментный регистр (кроме CS) или переменная. Оба операнда должны быть одного и того же размера — байт, слово или двойное слово. Нельзя выполнять пересылку данных с помощью MOV из одной переменной в другую, из одного сегментного регистра в другой. Нельзя помещать в сегментный регистр непосредственный операнд —, эти операции выполняют двумя командами (из сегментного регистра в обычный и уже из него в другой сегментный) или парой команд PUSH/POP. Загрузка регистра SS командой MOV автоматически запрещает прерывания до окончания следующей за этим команды MOV, так что можно загрузить SS и ESP двумя последовательными командами MOV, не опасаясь, что в этот момент произойдет прерывание, обработчик которого получит неправильный стек. В любом случае для загрузки значения в регистр SS предпочтительнее команда Пересылка данных. Табл. 2.2
Это набор команд, которые копируют содержимое источника в приемник, если удовлетворяется, то или иное условие (см. табл.2.3). Источником может быть регистр общего назначения или переменная, а приемником — только регистр. Условие, которое должно удовлетворяться,— просто равенство нулю или единице тех или иных флагов из регистра FLAGS, но, если использовать команды CMOVc c сразу после команды СМР (сравнение) с теми же операндами, условия приобретают особый смысл, например: cmp ах,bх; сравнить ах и bх cmovl ax,bx; если ах < bх, скопировать bх в ахСлова «выше» и «ниже» в таблице 2.3. относятся к сравнению чисел без знака, слова «больше» и «меньше» учитывают знак. Разновидности команды CMOVcc. Табл.2.3
Табл.2.4.
Содержимое операнда 2 копируется в операнд 1, а старое содержимое операнда 1 — в операнд 2. XCHG можно выполнять над двумя регистрами или над регистром и переменной. xchg eax,ebx; то же, что три команды на языке С:temp = eax; eax = ebx; ebx = temp; xchg al,al; а эта команда не делает ничего Табл.2.5
Обращает порядок байт в 32-битном регистре. Биты 0—7 (младший байт младшего слова) меняются местами с битами 24—31 (старший байт старшего слова), а биты 8—15 (старший байт младшего слова) меняются местами с битами 16—23 (младший байт старшего слова). Чтобы обратить порядок байт в 16-битном регистре, следует использовать команду XCHG: xchg al,ah; обратить порядок байт в АХВ процессорах Intel команду BSWAP можно использовать и для обращения порядка байт в 16-битных регистрах, но в некоторых совместимых процессорах других фирм этот вариант BSWAP не реализован. Табл.2.6.
Помещает содержимое источника в стек. Источником может быть регистр, сегментный регистр, непосредственный операнд или переменная. Фактически эта команда копирует содержимое источника в память по адресу SS:[ESP] и уменьшает ESP на размер источника в байтах (2 или 4). Команда PUSH практически всегда используется в паре с POP (считать данные из стека). Так, например, чтобы скопировать содержимое одного сегментного регистра в другой (что нельзя выполнить одной командой MOV), можно использовать такую последовательность команд: push cspop ds; теперь DS указывает на тот же сегмент, что и CSДругое частое применение команд PUSH/POP — временное хранение переменных, например: push eax; сохраняет текущее значение ЕАХ...; здесь располагаются какие-нибудь команды,; которые используют ЕАХ, например CMPXCHG pop eax; восстанавливает старое значение ЕАХНачиная с 80286, команда PUSH ESP (или SP) помещает в стек значение ESP до того, как эта же команда его уменьшит, в то время как на 8086 SP помещался в стек уже уменьшенным на два. Табл.2.7
Помещает в приемник слово или двойное слово, находящееся в вершине стека, увеличивая ESP на 2 или 4 соответственно. POP выполняет действие, полностью обратное PUSH. Приемником может быть регистр общего назначения, сегментный регистр, кроме CS (чтобы загрузить CS из стека, надо воспользоваться командой RET), или переменная. Если в роли приемника выступает операнд, использующий ESP для косвенной адресации, команда POP вычисляет адрес операнда уже после того, как она увеличивает ESP. Табл.2.8
PUSHA помещает в стек регистры в следующем порядке: АХ, СХ, DX, ВХ, SP, ВР, SI и DI. PUSHAD помещает в стек ЕАХ, ЕСХ, EDX, ЕВХ, ESP, EBP, ESI и EDI. (В случае SP и ESP используется значение, которое находилось в этом регистре до начала работы команды.) В паре с командами POPA/POPAD, считывающими эти же регистры из стека в обратном порядке, это позволяет писать подпрограммы (обычно обработчики прерываний), которые не должны изменять значения регистров по окончании своей работы. В начале такой подпрограммы вызывают команду PUSHA, а в конце— РОРА. На самом деле PUSHA и PUSHAD — одна и та же команда с кодом 60h. Ее поведение определяется тем, выполняется ли она в 16- или в 32-битном режиме. Если программист использует команду PUSHAD в 16-битном сегменте или PUSHA в 32-битном, ассемблер просто записывает перед ней префикс изменения размерности операнда (66h). Это же будет распространяться на некоторые другие пары команд: РОРА/POPAD, POPF/POPFD, PUSHF/PUSHFD, JCXZ/JECXZ, CMPSW/CMPSD, INSW/INSD, LODSW/LODSD, MOVSW/MOVSD, OUTSW/OUTSD, SCASW/SCASD и STOSW/STOSD. Табл.2.9
Эти команды выполняют действия, полностью обратные действиям PUSHA и PUSHAD, за исключением того, что помещенное в стек значение SP или ESP игнорируется. РОРА загружает из стека DI, SI, BP, увеличивает SP на два, загружает ВХ, DX, CX, AX, a POPAD загружает EDI, ESI, ЕВР, увеличивает ESP на 4 и загружает ЕВХ, EDX, ЕСХ, ЕАХ. Табл.2.10.
Копирует число из порта ввода-вывода, номер которого указан в источнике, в приемник. Приемником может быть только AL, АХ или ЕАХ. Источник— или непосредственный операнд, или DX, причем можно указывать только номера портов не больше 255. Табл.2.11.
Копирует число из источника (AL, АХ или ЕАХ) в порт ввода-вывода, номер которого указан в приемнике. Приемник может быть либо непосредственным номером порта, либо регистром DX. На командах IN и OUT строится все общение процессора с устройствами ввода-вывода — клавиатурой, жесткими дисками, различными контроллерами, и используются они, в первую очередь, в драйверах устройств. Например, чтобы включить динамик ПК, достаточно выполнить команды: in al,61h or al,3 out 61h,al Табл.2.12.
Команда CWD превращает слово в AХ в двойное слово, младшая половина которого (биты 0—15) остается в АХ, а старшая (биты 16—31) располагается в DX. Команда CDQ выполняет аналогичное действие по отношению к двойному слову в ЕАХ, расширяя его до учетверенного слова в EDX:EAX. Эти команды всего лишь устанавливают все биты регистра DX или EDX в значение, равное значению старшего бита регистра АХ или ЕАХ, сохраняя таким образом его знак. Табл.2.14.
CBW расширяет байт, находящийся в регистре AL, до слова в АХ, CWDE расширяет слово в АХ до двойного слова в ЕАХ. CWDE и CWD отличаются тем, что CWDE располагает свой результат в ЕАХ, в то время как CWD, команда, выполняющая точно такое же действие, располагает результат в паре регистров DX:AX. Так же как и команды CWD/CDQ, расширение выполняется путем установки каждого бита старшей половины результата равным старшему биту исходного байта или слова, то есть:
Копирует содержимое источника (регистр или переменная размером в байт или слово) в приемник (16- или 32-битный регистр) и расширяет знак аналогично командам CBW/CWDE. Табл.2.17.
Копирует содержимое источника (регистр или переменная размером в байт или слово) в приемник (16- или 32-битный регистр) и расширяет нулями, то есть команда movzx ax,blэквивалентна паре команд mov al,blmov ah,0. Табл.2.18.
Команда: помещает в AL байт из таблицы в памяти по адресу ES:BX (или ES:EBX) со смещением относительно начала таблицы равным AL. В качестве аргумента для XLAT в ассемблере можно указать имя таблицы, но эта информация никак не используется процессором и служит только как комментарий. Если этот комментарий не нужен, можно применить форму записи XLATB. В качестве примера использования XLAT можно написать следующий вариант преобразования шестнадцатеричного числа в ASCII-код соответствующего ему символа: mov al,0Ch mov bx, offset htable xlatbЕсли в сегменте данных, на который указывает регистр, было записано htable db "0123456789ABCDEF"то теперь AL содержит не число 0Сh, а ASCII-код буквы «С». Разумеется, это преобразование можно выполнить, используя гораздо более компактный код всего из трех арифметических команд, который будет рассмотрен в описании команды DAS, но с XLAT можно выполнять любые преобразования такого рода. Табл.2.19.
Вычисляет эффективный адрес источника (переменная) и помещает его в приемник (регистр). С помощью LEA можно вычислить адрес переменной, которая описана сложным методом адресации, например по базе с индексированием. Если адрес 32-битный, а регистр-приемник 16-битный, старшая половина вычисленного адреса теряется, если наоборот, приемник 32-битный, а адресация 16-битная, то вычисленное смещение дополняется нулями. Команду LEA часто используют для быстрых арифметических вычислений, например умножения: lea bx,[ebx+ebx*4]; ВХ=ЕВХ*5или сложения: lea ebx,[eax+12]; ЕВХ=ЕАХ+12 (эти команды меньше, чем соответствующие MOV и ADD, и не изменяют флаги) Варианты задани 2.3.Контрольные вопросы: 1. Основные команды ассемблера 2. Команды пересылки 3. Арифметические команды 4. Способы адресации 5. Окно дизассемблера в отладчике
Лабораторная работа № 3
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2016-04-26; просмотров: 387; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.152.146 (0.01 с.) |