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

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

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
Л2. Отладка кода 331
Рис. Л2.3. Регистры (Qt Creator)
Как в функции передаются вещественные параметры (в исследуемом компиля-
6. торе и платформе)? Как в функции передаются три и более параметров (в исследуемом компилято-
7. ре и платформе)?
8.
Чем различается код, созданный компиляторами одного семейства для различ­ных платформ? Чем различается код, созданный различными компиляторами для одной плат-
9. формы?
Лабораторная работа 3
Модули и функции на ассемблере
Цель работы:
изучить процесс компиляции программы на C++; научиться включать в проекты на языке C++ ассемблерные модули; научиться описывать функции и вызывать из программы на языке C++.
Л3.1. Задание на лабораторную работу
Задание 1.
Разработайте ассемблерную функцию, вычисляющую целое вы­ражение от целого аргумента (в соответствии с вариантом), а также головную программу на языке C++, использующую разработанную функцию.
(1)%5
+1
Вариант
1 y(x)=1+x/2
2 y(x)=x%4 x
3 y(x)=3x +1
4 y(x)=x
3
5 y(x)=44x
Задание 2.
числяющую значение
Разработайте программу, целиком написанную на ассемблере, вы-
y(x)
для
x =13
и выводящую полученное значение на стан-
дартный вывод с использованием библиотеки libc (в частности, функции printf).
Задание 3.
Опишите функцию на произвольном языке высокого уровня (вклю-
чая C/C++) и вызовите её из ассемблерной функции.
(1)%3
+1
Вариант
1 Вывод двух параметров на экран с пояснениями
2 Ввод результата с клавиатуры
3 Случайный результат в заданном диапазоне
Задание 4. Бонус (+2 балла).
с параметрами
a,b,...
и результатамиxиyи вызовите её из другой ассемблерной
Опишите на ассемблере одну подпрограмму
программы.
Л3. Модули и функции на ассемблере 333
(1)%2
+1
1
2
x = a + c · b y = a c · b
x = a y =2ab
2
2
b
Вариант
Л3.2. Теоретические сведения
Для выполнения данной лабораторной работы необходимо изучить следующие
разделы:
4.1. Компиляция.
7.2. Типы данных.
6.2. Подпрограммы и функции.
6.1. Структура программы на ассемблере.
5.2. Основные команды.
Подключение к проекту модулей на ассемблере
Code::Blocks
меню
FileNew Empty f ile
Создать ассемблерный модуль в Code::Blocks можно, используя
. Имя файла обязательно должно иметь расши­рение.S(заглавное; расширение.sне воспринимается Code::Blocks как допусти­мое).
После создания в проекте файла с таким расширением он во время сборки проекта обрабатывается препроцессором и компилируется gcc; полученный объ­ектный файл в дальнейшем используется линкером. Дополнительных настроек делать не нужно.
Qt Creator
sqr.S
Файл проекта Qt Creator для добавления ассемблерного модуля
необходимо отредактировать вручную, добавив строку
SOURCES += sqr.S
так как мастер добавления файлов не воспринимает расширения.Sи.sкак допустимые для исходного кода.
1 TEMPLATE = app 2 CONFIG += console 3 CONFIG -= app_bundle 4 CONFIG -= qt
5
6
SOURCES += main.cpp
7 SOURCES += sqr.S
,
334 Приложение А. Лабораторный практикум GNU Assembler
8
9
include(deployment.pri)
10 qtcAddDeployment()
Файл
sqr.S
должен находиться в той же папке, что и проект. Других настроек,
кроме редактирования файла проекта, делать не нужно.
Л3.3. Вопросы
1. Какие вы знаете соглашения о вызове?
2. Какая команда передаёт управление подпрограмме?
3. Какая команда возвращает управление вызывающей программе?
4. Что такое адрес возврата?
5. Какие вы знаете регистры общего назначения?
6. Какие вы знаете команды ассемблера x86?
7. Какие вы знаете флаги?
Лабораторная работа 4
Использование ассемблерных вставок в программах на C++
Цель работы:
ассемблерные фрагменты.
Л4.1. Задание на лабораторную работу
Задание 1.
помощи ассемблерной вставки
(1)%6
+1
1 Сложение целых чисел без знака
2 Сложение целых чисел со знаком
3 Вычитание целых чисел без знака
4 Вычитание целых чисел со знаком
5 Увеличение целого числа без знака на 1 (инкремент)
6 Увеличение целого числа со знаком на 1 (инкремент)
После команды сложения/вычитания проанализируйте соответствующий флаг состояния процессора, и, в зависимости от его значения, выведите результат и стро­ку «Результат верный» (если не было переполнения) или «Результат неверный» (при переполнении).
Задание 2.
дание 1) как ассемблерную вставку в программу на C++.
Задание 3.
имён регистров.
Задание 4. Бонус (+2 балла).
Придумайте и запишите в отчёте:
маску (т.е. второй операнд бинарной побитовой операции) для преобразова-
ния кодов ASCII [59] цифр ’0’...’9’ в их двоичные эквиваленты (однобайтовые числа 0...9) с помощью операции AND. При этом ASCII-код нуля (шестнадца­теричное число лее предпочтительное и самодокументирующееся представление ASCII-кода нуля — единицы (’1’, шестнадцатеричное число 0x31 или 3116)—в01,ит.д.; необходимую операцию и маску для преобразования однобайтовых чисел
0...9 в их коды ASCII;
научиться вставлять в программы на языке высокого уровня
Разработайте и выполните программу, в которой реализуйте при
Вариант
Реализуйте задание лабораторной работы Л3 (см. раздел Л3.1, за-
Реализуйте задание 2, не используя в тексте вставки конкретных
0x30
, что также иногда записывается как
’0’
) должен быть преобразован в однобайтовое число 00, ASCII-код
3016, однако наибо-
336 Приложение А. Лабораторный практикум GNU Assembler
маску, которая преобразовывает строчные английские буквы в прописные и наоборот с помощью операции XOR.
Коды ASCII приведены в приложении Б.
Реализуйте преобразования ASCII-кодов цифр в значения и обратно как ассем­блерную вставку в программу на C++.
Л4.2. Дополнительные бонусные и штрафные баллы
балла за неуказание в списке перезаписываемых элементов модифицируе-
4
мых в ассемблерной вставке регистров общего назначения, памяти, флагов.
Исключение — те регистры, которые текущая версия компилятора не позволя­ет указать в списке перезаписываемых (для некоторых версий это esi, edi).
Л4.3. Теоретические сведения
Для выполнения данной лабораторной работы необходимо изучить следующие разделы:
7.2. Типы данных.
4.3. Ассемблерные вставки в код C++.
5.2. Основные команды.
Л4.4. Вопросы
1. Каким ключевым словом открывается ассемблерная вставка?
2. Чем различаются базовый и расширенный синтаксис вставок?
3. Где описываются входные параметры ассемблерных вставок?
4. Где описываются выходные параметры ассемблерных вставок?
5. Где описываются элементы, изменяемые в ассемблерных вставках?
6.
Где описываются метки ЯВУ, на которые может быть передано управление из
ассемблерных вставок?
7. Как из ассемблерной вставки обратиться к локальным переменным? Какие вы знаете ограничения на размещение параметров ассемблерных вста-
8. вок?
Лабораторная работа 5
Программирование FPU
Цель работы: познакомиться с работой сопроцессора и его командами.
Л5.1. Задание на лабораторную работу
Задание 1.
над вещественными числами одинарной точности (тип float).
Проверьте, что программа действительно работает с операндами одинарной
точности, а не приводит к типу float окончательный результат.
1
Разработайте программу на языке C++, выполняющую вычисления
(1)%3
+1
Вариант
1 Найти разность a b для различных значений a, b:
a = 123456789; b = 123456788, a = 123456788; b = 123456787
2
2 Найти значение выражения
для различных значений a, b (пример Лавренова):
(a + b)
(a2+2ab)
2
b
a = 95; b =1, a = 95; b =0,1
3 Не используя умножение, найти суммы
N1
i=0
1
N
и S2=
=
S
1
для различных N : 102, 104, 106, 107, 108, 10
2N1
i=0
1
N
9
Сравните полученный результат с теоретическим. Объясните результат. Измените тип операндов на double. Объясните результат. Задание 2. Составьте программу calc для вычисления выражения с использо-
ванием сопроцессора в соответствии со своим вариантом.
Задание 3. Бонус (+2 балла).
Оформите вычисления из задания 2 как функ-
цию на ассемблере (вещественную от вещественного аргумента x).
Л5.2. Дополнительные бонусные и штрафные баллы
2 балла за каждое использование команды finit.
1
Использованы материалы: П. Закляков. Представление чисел в памяти ЭВМ. Ошибка «Цикли­ческая дыра». Системный Администратор, № 10 (119) 2012 г.; В. Яшкардин. IEEE 754 — стандарт двоичной арифметики с плавающей точкой
338 Приложение А. Лабораторный практикум GNU Assembler
Инициализация процессора, в том числе и модуля FPU, выполняется операци-
онной системой в процессе загрузки.
2 балла за несбалансированный стек FPU после завершения вычислений.
2
балла за потерю точности из-за округления промежуточных расчётов в за-
даниях 2 и 3.
балла за включение в отчёт заведомо недостоверных цифр (более 2 недо-
4
стоверных десятичных знаков в округлённом результате).
+1 балл за поясняющие текущее содержимое стека FPU комментарии.
Л5.3. Варианты заданий для программы calc
2
МП-30 МП-34 МП-35
1.2+x
1
2
2
x
cos(x)
sin(x)+2
3 sin(2x) + cos(3x)
4 ln 2 · (sin(1.2x))
1.5x2− 3x − 1 sin(1.9x)
x 1.5
0.99x + x
2
3.45x2+0.1
sin(x − 1)
2x
sin(x) · cos(0.9x)
sin(0.27x) cos(x)
cos(x)
sin(x)+2
5 1.5+3.88(x2− 1) cos3(x)+tg(x) sin(0.9x) + cos(x)
6
cos(x)
sin(2x)+1.5
7 cos(x +0.9x2) 3.4x2+1.5 sin(1.5x)+
8 cos(x 0.8) + x (
!
9
sin(2x)+x
10 2x2+ x 5
x
sin2(
+1) x(x2+3x − 5)
2
x
+1.5)(x +1) sin((cos(x)+1.3))
2
x2+4
sin(2x)
!
|x ln 2|
"
x − 1.2
2x
x tg(x)
2
1
x
11 (x + 1)(2x 1) 3x2+2x − 1 |3x3− 2.5|
12 sin(2x) · cos(x) (2x +0.5)(3x − 2)
7+x
2x +1
13 sin(2.27x) cos(x) sin(1.88x +1)· cos(x) cos(x +ln2)
14
cos(x)
sin(2x +1)
15 sin(0.99x) + cos(x)
x3− 5+x cos(x 0.8) + x
sin2(x)
1+tg(x)
1.1x +0.5x
2
2
2
Использованы: лабораторная работа, подготовленная Л. В. Илюшечкиной
Л5. Программирование FPU 339
16 sin(2.5x) cos(x2) cos2(x) + tg(1.5x) cos(x) · (1 + 3x2)
17 sin(1.5x) + cos(x) 2√x +1
18 sin((cos(x)+1.3))
sin(x)+1
2
19 sin(t +1),x=2.123t (x +3)2− sin2(x) |tg(
20 cos(x)+sin(2x) cos(2.1x) sin(x)
21 0.9x2+0.7
22 0.5sin(0.5x +2)
23
sin(x)
cos(x)+1.1
sin2(x)
1+tg3(x)
x
3x2− x +1
x2(2 3x)
sin(1.5x) cos(1.5x)
1+2x − 3x
x
2
2
)+1|
sin(0.5x)
2
x
cos2(x) + tg(2x)
x2− x +8.7
1
2.5+x
2
24 cos((0.7+x)x) |cos(2x +0.9)| sin(x) · (2.5x2+3)
25 | cos(2 + x2)| cos(x 0.8) + x
26 |1.5x| + x
2
1.1x +0.5x
2
2
sin(x) + 2 cos(x)
x
sin(
) cos(2x)
2.1
Л5.4. Теоретические сведения
Для выполнения данной лабораторной работы необходимо изучить следующие
разделы:
3.4. Математический сопроцессор (FPU x87).
5.3. Команды FPU.
Л5.5. Вопросы
1. Какие регистры используются в сопроцессоре для хранения операндов?
2.
Какие команды используются для выполнения арифметических операций над вещественными числами? Какие команды используются для выполнения тригонометрических операций?
3.
4. Какие команды используются для сравнения вещественных чисел? Какие флаги регистра
5.
flags
содержат результат сравнения вещественных
чисел?
Лабораторная работа 6
Программирование ветвящихся и циклических алгоритмов
Цель работы:
ознакомиться с командами условного и безусловного перехода;
научиться использовать их для реализации ветвящихся и циклических алгоритмов.
Л6.1. Задание на лабораторную работу
Задание 1. Вычислите для заданных целых x, y
(1)%3
+1
1 f(x)=
2 f(x,y)=
3 f(x,y)=
x/2,x%2 = 0 3x +1,x%2 =0
xx+ y<4 y +2,x+ y 4
y/x y%x =0 y · x, y%x =0
Вариант
Задание 2. Вычислите для заданного вещественного x
(1)%11
+1
1
2
3
4
5
6
7
y(x)=
y(x)=
y(x)=
y(x)=
y(x)=
y(x)=
y(x)=
2 · (x/3) + 15,x 0 0,x<0
x + x/2+x/4+x/8,x0 x 1,x<0
0,x0.8 x 0.8,x>0.8
3
(x 1) · (x +1), 4 x 4
x
1,x<4 x>4
π, x > π x, x  π
2
)/(x +1),x>−1
(x
3
x
,x1
1 x/3,x<13 1+x, x  13
Вариант
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]