Контроль переменных и данных различного типа 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Контроль переменных и данных различного типа



Окно Watch – очень полезный инструмент при отладке приложений. Оно позволяет наблюдать значения переменных в процессе выполнения программы.

Для добавления новой переменной в окно Watch необходимо либо написать ее имя в пустой строчке, либо перетянуть мышкой из исходного файла в окно Watch.

В окне Watch можно изменять интерпретацию типа данных переменной. Форматирующий символ там просто вводится сразу за именем переменной с разделительной запятой.

Например, если hexNumber имеет значение 0x0041, а вы хотите видеть значение в символьной форме, в категории Name окна Watch введите hexNumber,c. Когда вы нажмете Enter, появится символьный формат значения: hexNumber,c = ‘A’.

Форматирующие символы дисплея отладчика. Табл. 1.1.

Символ Формат Значение Представление
d, I Десятичное целое со знаком 0xF000F061 -268373911
U Десятичное целое без знака 0x0066  
O Восьмеричное целое без знака 0xF064  
x, X Шестнадцатеричное целое 70148 (десятичное) 0x000011204
l, h Префикс long или short для d, I,U, O, x, X 00406040,hx 0x0c20
F Десятичная нотация со знаком 5./2. 2.500000
E Научная нотация со знаком 5./2. 2.500000+004
G Десятичная или научная нотация со знаком, какая короче 5./2. 2.5
С Одиночный символ 0x0066 ‘f’
S Строка 0x012fde8 “The String”
su Строка Unicode   “The String”
St Строка Unicode или ANSI в зависимости от установки Unicode Strings    
Hr HRESULT код ошибки Win32 0x00000000L S_OK
wc Флаг класса Windows 0x00000040 WC_DEFAULT
wm Номер сообщения Windows 0x000 WM_CLOSE

 

Вы можете так же пользоваться форматирующими значениями для содержимого памяти в применении к любым выражениям, оцениваемым как адрес. Для представления массива символов в виде строки поставьте перед именем массива символ &, например, &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 действует аналогично операторам присваивания из языков высокого уровня, то есть команда

mov ax,bx

эквивалентна выражению

ах:= bх; языка Паскаль или ах = bх; языка С, за исключением того, что команда ассемблера позволяет работать не только с переменными в памяти, но и со всеми регистрами процессора.

В качестве источника для MOV могут использоваться: число (непосредственный операнд), регистр общего назначения, сегментный регистр или переменная (то есть операнд, находящийся в памяти). В качестве приемника — регистр общего назначения, сегментный регистр (кроме CS) или переменная. Оба операнда должны быть одного и того же размера — байт, слово или двойное слово.

Нельзя выполнять пересылку данных с помощью MOV из одной переменной в другую, из одного сегментного регистра в другой.

Нельзя помещать в сегментный регистр непосредственный операнд , эти операции выполняют двумя командами (из сегментного регистра в обычный и уже из него в другой сегментный) или парой команд PUSH/POP.

Загрузка регистра SS командой MOV автоматически запрещает прерывания до окончания следующей за этим команды MOV, так что можно загрузить SS и ESP двумя последовательными командами MOV, не опасаясь, что в этот момент произойдет прерывание, обработчик которого получит неправильный стек. В любом случае для загрузки значения в регистр SS предпочтительнее команда

Пересылка данных. Табл. 2.2

· Команда: CMOVcc приемник, источник
· Назначение: Условная пересылка данных
· Процессор: P6

Это набор команд, которые копируют содержимое источника в приемник, если удовлетворяется, то или иное условие (см. табл.2.3). Источником может быть регистр общего назначения или переменная, а приемником только регистр. Условие, которое должно удовлетворяться,— просто равенство нулю или единице тех или иных флагов из регистра FLAGS, но, если использовать команды CMOVc c сразу после команды СМР (сравнение) с теми же операндами, условия приобретают особый смысл, например:

cmp ах,bх; сравнить ах и bх cmovl ax,bx; если ах < bх, скопировать bх в ах

Слова «выше» и «ниже» в таблице 2.3. относятся к сравнению чисел без знака, слова «больше» и «меньше» учитывают знак.

Разновидности команды CMOVcc. Табл.2.3

Код команды Реальное условие Условие для CMP
CMOVA CMOVNBE CF = 0 и ZF = 0 если выше если не ниже или равно
CMOVAE CMOVNB CMOVNC CF = 0 если выше или равно если не ниже если нет переноса
CMOVB CMOVNAE CMOVC CF = 1 если ниже если не выше или равно если перенос
CMOVBE CMOVNA CF = 1 и ZF = 1 если ниже или равно если не выше
CMOVE CMOVZ ZF = 1 если равно если ноль
CMOVG CMOVNLE ZF = 0 и SF = OF если больше если не меньше или равно
CMOVGE CMOVNL SF = OF если больше или равно если не меньше
CMOVL CMOVNGE SF <> OF если меньше если не больше или равно
CMOVLE CMOVNG ZF = 1 и SF <> OF если меньше или равно если не больше
CMOVNE CMOVNZ ZF = 0 если не равно если не ноль
CMOVNO OF = 0 если нет переполнения
CMOVO OF = 1 если есть переполнение
CMOVNP CMOVPO PF = 0 если нет четности если нечетное
CMOVP CMOVPE PF = 1 если есть четность если четное
CMOVNS SF = 0 если нет знака
CMOVS SF = 1 если есть знак

Табл.2.4.

· Команда: XCHG операнд1, операнд2
· Назначение: Обмен операндов между собой
· Процессор:  

Содержимое операнда 2 копируется в операнд 1, а старое содержимое операнда 1 — в операнд 2. XCHG можно выполнять над двумя регистрами или над регистром и переменной.

xchg eax,ebx; то же, что три команды на языке С:temp = eax; eax = ebx; ebx = temp; xchg al,al; а эта команда не делает ничего Табл.2.5
· Команда: BSWAP регистр32
· Назначение: Обмен байт внутри регистра
· Процессор:  

Обращает порядок байт в 32-битном регистре. Биты 0—7 (младший байт младшего слова) меняются местами с битами 24—31 (старший байт старшего слова), а биты 8—15 (старший байт младшего слова) меняются местами с битами 16—23 (младший байт старшего слова).

mov eax,12345678h bswap eax; теперь в еах находится 78563412h

Чтобы обратить порядок байт в 16-битном регистре, следует использовать команду XCHG:

xchg al,ah; обратить порядок байт в АХ

В процессорах Intel команду BSWAP можно использовать и для обращения порядка байт в 16-битных регистрах, но в некоторых совместимых процессорах других фирм этот вариант BSWAP не реализован.

Табл.2.6.
· Команда: PUSH источник
· Назначение: Поместить данные в стек
· Процессор:  

Помещает содержимое источника в стек. Источником может быть регистр, сегментный регистр, непосредственный операнд или переменная. Фактически эта команда копирует содержимое источника в память по адресу 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
 Команда: POP приемник
 Назначение: Считать данные из стека
 Процессор:  

Помещает в приемник слово или двойное слово, находящееся в вершине стека, увеличивая ESP на 2 или 4 соответственно. POP выполняет действие, полностью обратное PUSH. Приемником может быть регистр общего назначения, сегментный регистр, кроме CS (чтобы загрузить CS из стека, надо воспользоваться командой RET), или переменная. Если в роли приемника выступает операнд, использующий ESP для косвенной адресации, команда POP вычисляет адрес операнда уже после того, как она увеличивает ESP.

Табл.2.8
· Команда: PUSHA PUSHAD
· Назначение: Поместить в стек все регистры общего назначения
· Процессор: 80186 80386

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
· Команда: POPA POPAD
· Назначение: Загрузить из стека все регистры общего назначения
· Процессор: 80186 80386

Эти команды выполняют действия, полностью обратные действиям PUSHA и PUSHAD, за исключением того, что помещенное в стек значение SP или ESP игнорируется. РОРА загружает из стека DI, SI, BP, увеличивает SP на два, загружает ВХ, DX, CX, AX, a POPAD загружает EDI, ESI, ЕВР, увеличивает ESP на 4 и загружает ЕВХ, EDX, ЕСХ, ЕАХ.

Табл.2.10.
· Команда: IN приемник, источник
· Назначение: Считать данные из порта
· Процессор:  

Копирует число из порта ввода-вывода, номер которого указан в источнике, в приемник. Приемником может быть только AL, АХ или ЕАХ. Источник— или непосредственный операнд, или DX, причем можно указывать только номера портов не больше 255.

Табл.2.11.
· Команда: OUT приемник, источник
· Назначение: Записать данные в порт
· Процессор:  

Копирует число из источника (AL, АХ или ЕАХ) в порт ввода-вывода, номер которого указан в приемнике. Приемник может быть либо непосредственным номером порта, либо регистром DX. На командах IN и OUT строится все общение процессора с устройствами ввода-вывода — клавиатурой, жесткими дисками, различными контроллерами, и используются они, в первую очередь, в драйверах устройств. Например, чтобы включить динамик ПК, достаточно выполнить команды:

in al,61h or al,3 out 61h,al Табл.2.12.
· Команда: CWD
· Назначение: Конвертирование слова в двойное слово
· Процессор:  
Табл.2.13.
· Команда: CDQ
· Назначение: Конвертирование двойного слова в учетверенное
· Процессор:  

Команда CWD превращает слово в в двойное слово, младшая половина которого (биты 0—15) остается в АХ, а старшая (биты 16—31) располагается в DX. Команда CDQ выполняет аналогичное действие по отношению к двойному слову в ЕАХ, расширяя его до учетверенного слова в EDX:EAX. Эти команды всего лишь устанавливают все биты регистра DX или EDX в значение, равное значению старшего бита регистра АХ или ЕАХ, сохраняя таким образом его знак.

Табл.2.14.
 Команда: CBW
 Назначение: Конвертирование байта в слово
 Процессор:  
Табл.2.15.
 Команда: CWDE
 Назначение: Конвертирование слова в двойное слово
 Процессор:  

CBW расширяет байт, находящийся в регистре AL, до слова в АХ, CWDE расширяет слово в АХ до двойного слова в ЕАХ. CWDE и CWD отличаются тем, что CWDE располагает свой результат в ЕАХ, в то время как CWD, команда, выполняющая точно такое же действие, располагает результат в паре регистров DX:AX. Так же как и команды CWD/CDQ, расширение выполняется путем установки каждого бита старшей половины результата равным старшему биту исходного байта или слова, то есть:

mov al,0F5h; AL = 0F5h = 245 = -11 cbw; теперь АХ = 0FFF5h = 65 525 = -11Так же как и в случае с командами PUSHA/PUSHAD, пара команд CWD/CDQ — это одна команда с кодом 99h, и пара команд CBW/CWDE — одна команда с кодом 98h. Интерпретация этих команд зависит от того, в каком (16-битном или в 32-битном) сегменте они исполняются, и точно так же, если указать CDQ или CWDE в 16-битном сегменте, ассемблер поставит префикс изменения разрядности операнда. Табл.2.16.
 Команда: MOWSX приемник, источник
 Назначение: Пересылка с расширением знака
 Процессор:  

Копирует содержимое источника (регистр или переменная размером в байт или слово) в приемник (16- или 32-битный регистр) и расширяет знак аналогично командам CBW/CWDE.

Табл.2.17.
 Команда: MOWZX приемник, источник
 Назначение: Пересылка с расширением нулями
 Процессор:  

Копирует содержимое источника (регистр или переменная размером в байт или слово) в приемник (16- или 32-битный регистр) и расширяет нулями, то есть команда

movzx ax,bl

эквивалентна паре команд

mov al,blmov ah,0. Табл.2.18.
 Команда: XLAT адрес XLATB
 Назначние: Трансляция в соответствии с таблицей
 Процессор:  

Команда: помещает в 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 приемник, источник
 Назначение: Вычисление эффективного адреса
 Процессор:  

Вычисляет эффективный адрес источника (переменная) и помещает его в приемник (регистр). С помощью 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; просмотров: 345; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.221.165.246 (0.047 с.)