Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Архитектура вычислительных систем и Ассемблер с приложением методических указаний к лабораторным работам. Учебное пособие
.pdf
Л1. Представление данных в ЭВМ 321
Л1.3. Рекомендации
Для просмотра содержимого памяти используйте возможности отладчика (окно
Memory или подобное ему) или отладочную печать. Не стоит использовать для
исследования представления объектов в памяти окно Watches, так как оно по
определению показывает состояние объекта, абстрагированное от представления.
Перенаправить стандартный вывод программы в файл в большинстве оболочек,
в том числе bash, возможно с помощью символа >.
Скопировать вывод программы из терминала в отчёт можно, используя буфер обмена primary. Для этого необходимо выделить мышью необходимый текст
в терминале и затем щёлкнуть средней кнопкой мыши в том месте редактора,
где планируется вставка. После закрытия текста-источника содержимое буфера
primary теряется, поэтому вставку желательно проводить непосредственно после
выделения фрагмента вывода в терминале.
В Microsoft Windows буфер primary недоступен.
Л1.4. Теоретические сведения
Для выполнения данной лабораторной работы необходимо изучить следующие
разделы:
1.2.1. Единицы измерения.
1.2.2. Порядок следования байтов.
3.2. Сегменты памяти.
2. Представление данных.
7. Программирование на языке высокого уровня: С++.
4.1.2. Этапы компиляции.
Отладка в интегрированных средах разработки
Различные IDE для отладки программ используют собственные инструменты
или (чаще) предоставляют графический интерфейс к внешним отладчикам. Обычно
используется отладчик gdb (GNU Symbolic Debugger).
Базовые инструменты различных отладчиков и различных IDE схожи. Рассмотрим основные инструменты отладки на примере среды Qt Creator [83]; также
следует упомянуть особенности сред Code::Blocks [56] и TheIDE [70].
Точки останова
Точки останова представляют место или набор мест в коде, которые при выполнении прервут отлаживаемую программу и передадут управление пользователю.
Пользователь может просмотреть состояние прерванной программы или продолжить выполнение построчно или непрерывно.

322 Приложение А. Лабораторный практикум GNU Assembler
Обычно точки останова связаны с файлом исходных кодов и строкой или
началом функции (рис. Л1.1).
Рис. Л1.1. Точка останова в коде
Если выполнение не останавливается в точке останова, проверьте конфигурацию сборки. В большинстве сред разработки отладка возможна только для
отладочной (Debug), но не для оптимизированной (Release) сборки. В Qt Creator
возможна пошаговая отладка Release-сборки с использованием окон дизассемблера, регистров и памяти, но точки останова в исходном коде C++ в этом режиме
игнорируются.
Локальные и наблюдаемые переменные
Окно «Локальные и наблюдаемые переменные» отображает информацию о
верхнем кадре стека (параметры функции и локальные переменные), а также
о заданных выражениях. Данное окно может быть использовано для изменения
int
или
float
содержимого переменной простого типа данных (такого как
)во
время останова программы (рис. Л1.2).
В среде Code::Blocks окно просмотра переменных можно открыть, используя
меню Debug → Debugging windows → Watches (рис. Л1.3, внизу).
В TheIDE для просмотра переменных используются вкладки
и
Watches
панели
Debug
(доступна во время отладки внизу экрана, скрывается/-
Autos,Locals
показывается по Esc).

Л1. Представление данных в ЭВМ 323
Рис. Л1.2. Локальные и наблюдаемые переменные в Qt Creator
Рис. Л1.3. Отладочные окна Memory и Watches в Code::Blocks
Обозреватель и редактор памяти
Обозреватель и редактор памяти отображают содержимое памяти. В Qt Creator
как обозреватель, так и редактор памяти можно открыть для просмотра конкретной переменной, используя контекстное меню переменной в окне «Локальные
и наблюдаемые переменные» (рис. Л1.4), при этом подсвечивается не только начало, но и размер объекта.
Рис. Л1.4. Обозреватель и редактор памяти Qt Creator

324 Приложение А. Лабораторный практикум GNU Assembler
В среде Code::Blocks окно просмотра содержимого фрагмента памяти можно открыть, используя меню
Debug → Debugging windows → M emory dump
(рис. Л1.3, вверху). Адрес начала отображаемого фрагмента может быть литералом (конкретным адресом в памяти, как
регистром, в котором содержится адрес (
выражения должен быть указатель, например,
0x401060
$eax
) или выражением C++ (результатом
(char*)(&x)-4
), адресом переменной (&x),
— адрес на 4 байта
меньше, чем начало переменной x).
В текущей версии TheIDE нет инструмента для просмотра дампа памяти.
Содержимое памяти отображается как последовательность байтов. Каждый
байт представлен как беззнаковое целое (в виде двух шестнадцатеричных цифр)
и как ASCII-символ (справа). Байты разбиты на строки по 16; слева перед строкой
показан адрес первого байта в строке в шестнадцатеричном виде.
Создание 64-битной конфигурации Microsoft Visual Studio
Для создания 64-битной конфигурации Microsoft Visual Studio запустите
Microsoft Visual Studio в терминале Skylab (домен SIPC) и выполните следующие три шага (рис. Л1.5) [35]:
а)
б)
в)
Рис. Л1.5. Создание 64-битной конфигурации для проекта
в Microsoft Visual Studio

Л1. Представление данных в ЭВМ 325
Шаг 1. Запустить менеджер конфигураций (рис. Л1.5, а).
Шаг 2. В менеджере конфигураций выбрать поддержку новой платформы
(рис. Л1.5, б).
Шаг 3. Выбрать 64-битную платформу (x64), а в качестве основы выбрать
настройки от 32-битной версии (рис. Л1.5, в). Те настройки, которые влияют на
режим сборки, среда Microsoft Visual Studio скорректирует сама.
Л1.5. Вопросы
Как представляется символьная информация в компьютере в кодах ASCII,
1.
расширениях ASCII и различных кодировках Unicode?
2. Как хранятся русские буквы в «классических» и «широких» строках?
3. Как представляются целые числа со знаком и без знака?
4. Как перевести число в дополнительный код?
5. Как выполняются логические операции и сдвиги над строкой битов?
6.
Что такое расширение чисел со знаком и без знака? Для чего нужны операции
расширения?
7. Для чего нужно знать порядок следования байтов на вашем компьютере?

Лабораторная работа 2
Отладка кода
Цель работы:
научиться использовать инструменты отладки современных
IDE; исследовать генерируемый компилятором код.
Л2.1. Задание на лабораторную работу
Задание 1.
Разработайте программу на языке C++, вычисляющую три целых
выражения от целого аргумента (в соответствии с вариантом).
(№ − 1)%8
+1
Вариант
1 y(x)=x · 2
2 y(x)=−x − 1
3 y(x)=x · 3
а)
4 y(x)=|x|
5 y(x)=x · 5
6 y(x)=x/2
7 y(x)=x mod 4
8 y(x)=x
(№ − 1)%7
+1
2
Вариант
б)
1 y(x)=x +17
2 y(x)=x · 13
3 y(x)=x − 21
4 y(x)=x/11
5 y(x)=x · 7
6 y(x)=x/3
7 y(x)=x
2

Л2. Отладка кода 327
(№ − 1)%3
+1
1 y(x)=
в)
2 y(x)=
3 y(x)=
Примечание:
менной «узнаваемым» литералом упростит поиск её адреса.
Сборка всех заданий данной лабораторной работы выполняется одним компилятором
при одних и тех же настройках.
Не все изменения кода на C++ приведут к видимым изменениям дизассемблированного
кода.
Задание 2.
Не обязательно вводитьxс клавиатуры. Инициализация локальной пере-
Запустите программу и, используя инструменты отладчика (в част-
13,x 0
7,x<0
0,x<7
x, x 7
x, x > 13
−1,x 13
Вариант
ности, дизассемблер), изучите ассемблерный код, соответствующий вычислениям
(для Code::Blocks — переключитесь на синтаксис AT&T и включите Mixed mode,
чтобы в окне дизассемблера перед каждой группой команд, соответствующих
одному оператору языка высокого уровня, явно отображался этот оператор).
Занесите ассемблерный код, соответствующий вычислению
не связанный с вычислением
y(x)
, копировать в отчёт не нужно!). Определите и
y(x)
, в отчёт (код,
прокомментируйте:
– обращение к переменным x и y;
–
арифметические и логические операции — сложение, вычитание, умножение,
деление с остатком, деление на 2nи т. д. (по возможности);
– сравнения и передачу управления в ветвлениях.
Задание 3.
Внесите в программу из задания 1, а) изменения (либо, что предпочтительнее, добавьте новые фрагменты кода, выполняющие аналогичные вычисления для других переменных, используя макросы препроцессора или шаблоны
C++).
– сделайте переменные глобальными;
– измените тип с int на char, short, long и long long;
– измените тип с int на long double.
Опишите в отчёте различия в ассемблерном коде.
Задание 4.
Оформите вычисления из задания 1, а) как целую функцию от целого аргумента. Опишите в отчёте код вызова функции. Как передаётся аргумент?
Как возвращается значение?

328 Приложение А. Лабораторный практикум GNU Assembler
Задание 5.
Измените тип аргумента и результата на вещественный. Опишите в отчёте код вызова функции. Как передаётся аргумент? Как возвращается
значение?
Задание 6. Бонус (+2 балла).
Используйте в функции статическую перемен-
ную. Как выглядит обращение к ней?
Задание 7. Бонус (+2 балла за платформу):
запустите тестовую программу
(программы), используя платформу и/или компилятор, отличные от GNU/Linux
и GCC. Результаты с пояснениями внести в конспект.
Л2.2. Теоретические сведения
Для выполнения данной лабораторной работы необходимо изучить следующие
разделы:
3.2. Сегменты памяти.
3.3. Регистры.
4.1.2. Этапы компиляции.
5.1. Особенности GNU Assembler.
5.2.1. Общие команды.
Дизассемблер
Окно дизассемблера отображает дизассемблированный код для текущей функции (рис. Л2.1). В Qt Creator по умолчанию спрятано, перейти в режим работы на
уровне инструкций процессора возможно во время отладки.
В среде Code::Blocks окно дизассемблера можно открыть, используя меню
Debug → Debugging windows → Disassembly
(для редактирования кода и
для отладки используются разные наборы окон, поэтому открывать дизассемблер
необходимо уже в процессе отладки). Опция
Mixed mode
в этом окне включает
отображение строки C++ перед соответствующей ей группой команд. Кнопка
Adjust
позволяет перемотать дизассемблированный код к текущей команде. Кноп-
ка Save to text file — сохранить его.
Рис. Л2.2 показывает окно дизассемблера среды Code::Blocks с включённой
опцией M ixed mode (синтаксис AT&T).
Иногда при внесении изменений в программу и включённой опции
Mixed mode
ассемблерный код и операторы высокого уровня в окне дизассемблера не изменяются даже после пересборки проекта. В этом случае необходимо выключить
и снова включить
Mixed mode
(останавливать отладку и пересобирать проект
между этими действиями не надо).
В TheIDE панель дизассемблера всегда доступна во время отладки (справа). Её
содержимое можно скопировать в буфер обмена, используя пункт меню
Debug →
Copy disassembly.

Л2. Отладка кода 329
Рис. Л2.1. Дизассемблированный код программы (Qt Creator)
Содержимое окна дизассемблера в любой среде разработки — именно читабельное представление машинного кода отлаживаемой программы, а не промежуточная
стадия компиляции модуля в машинный код, формируемая командой
(промежуточный результат компиляции можно увидеть, запустив команду
-S <путь к cpp-файлу>
в консоли; в TheIDE можно использовать пункт меню
g++ -S
g++
Build → Show assembler code for ...).
Настройка синтаксиса ассемблерного кода
В зависимости от используемого отладчика и его настроек может различаться используемый синтаксис. Настроить вид дизассемблированного кода можно в настройках отладчика среды
(для Code::Blocks
Settings → Debugger → GDB/CDB debugger : default →
Choose disassembly flavor).
В Qt Creator настроить синтаксис дизассемблера можно в окне параметров (меню Инструменты→Параметры). Для этого используется переключатель «Стиль
Intel для дизассемблера», находящийся в разделе «Отладчик» этого окна на вкладке GDB.

330 Приложение А. Лабораторный практикум GNU Assembler
Рис. Л2.2. Дизассемблированный код программы (Code::Blocks)
Регистры
Окно «Регистры» отображает текущее содержимое регистров (рис. Л2.3).
В Qt Creator по умолчанию спрятано, включается через контекстное меню или
меню «Окно».
В среде Code::Blocks содержимое основных регистров можно увидеть, используя окно CPU registers (меню
Регистры сопроцессора отображаются в окне FPU status (меню
Information → FP U status
Debug → Debugging windows → CP U registers
Debug →
), но, в отличие от окна основных регистров, от-
крытое окно FPU status не позволяет продолжить отладку.
В TheIDE содержимое основных регистров показывается под панелью дизассемблера и всегда доступно во время отладки (справа).
).
Л2.3. Вопросы
Уметь пользоваться окнами просмотра переменных и содержимого памяти
1.
в отладчике используемой вами IDE.
Чем различается размещение в памяти локальных, глобальных и статических
2.
переменных?
3. Чем различается работа с целыми числами разной разрядности?
4. Чем различается работа с целыми и вещественными числами?
Как в функции передаются целые параметры (в исследуемом компиляторе
5.
и платформе)?
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
