Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Архитектура вычислительных систем и Ассемблер с приложением методических указаний к лабораторным работам. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
Л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,x13
Вариант
ности, дизассемблер), изучите ассемблерный код, соответствующий вычислениям (для 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. и платформе)?
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]