Главная » Просмотр файлов » Семинары по курсу «Архитектура ЭВМ и язык ассемблера» учебно-методическое пособие. Часть 2. - Е.А. Кузьменкова_ В.А. Падарян_ М.А. Соловьев

Семинары по курсу «Архитектура ЭВМ и язык ассемблера» учебно-методическое пособие. Часть 2. - Е.А. Кузьменкова_ В.А. Падарян_ М.А. Соловьев (1110589), страница 5

Файл №1110589 Семинары по курсу «Архитектура ЭВМ и язык ассемблера» учебно-методическое пособие. Часть 2. - Е.А. Кузьменкова_ В.А. Падарян_ М.А. Соловьев (Семинары по курсу «Архитектура ЭВМ и язык ассемблера» учебно-методическое пособие. Часть 2. - Е.А. Кузьменкова_ В.А. Падарян_ М.А. Соловьев) 5 страницаСеминары по курсу «Архитектура ЭВМ и язык ассемблера» учебно-методическое пособие. Часть 2. - Е.А. Кузьменкова_ В.А. Падарян_ М.А. Соловьев (1110589) 2019-04-28СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 5)

Опишите29структуру struct person, которая позволит хранить всю информацию об одном человеке, и реализуйте фрагмент ассемблерного кода, который заполняет массивstruct person persons[N] по трем заданным массивам name, height и weight.Задача 2-6Даны следующие объявления на языке Си:struct swallow {int is_african : 1;int is_unladen : 1;double velocity;int id;};static struct swallow s[100];Считая, что компилятор под IA-32/Linux располагает битовые поля от младших битов в пределах 32-разрядного двойного слова, напишите на ассемблере фрагменткода, который любым известным вам способом отсортирует массив s по неубыванию значений поля velocity.Задача 2-7Пусть массив s из задачи 2-6 уже отсортирован по возрастанию значений поля id ивсе эти значения различны. По заданному числу static int myid, которое гарантированно встречается в массиве, найдите и напечатайте соответствующее значениеis_unladen:а) используя линейный поиск;б) используя бинарный поиск.Задача 2-8Компилятор GCC позволяет при помощи атрибута структуры packed указать, что выравнивание полей в структуре не производится.

В этом случае все поля структурырасполагаются подряд. Этот синтаксис не входит в стандарт языка Си. Пусть даныдве идентичные структуры sp и su, отличающиеся только наличием или отсутствием этого атрибута.struct sp {char c;short s;int i;} __attribute__((packed));struct su {char c;short s;int i;};struct sp sp_data;struct su su_data;Осуществите копирование значений из sp_data в su_data и обратно.30Задача 2-9Даны следующие определения на языке Си:enum { RGB, CMYK };struct color{int type; // RGB или CMYKunion{struct { double r, g, b; } rgb;struct { double c, m, y, k; } cmyk;} u;};static struct color clr;Реализуйте фрагмент ассемблерной программы, который печатает YES, если в переменной clr записан белый цвет (RGB (1, 1, 1) или CMYK (0, 0, 0, 0)), и NO иначе.313.Организация вызова функцийАппаратный стекАрхитектура IA-32 реализует поддержку аппаратного стека в памяти.

Регистр ESPявляется указателем верхушки стека, команды PUSH и POP выполняют пересылкуданных и сдвигают должным образом указатель верхушки стека. Стек растет вниз:при помещении новых данных на стек адрес верхушки уменьшается, при снятииданных – увеличивается.

При выполнении 32-разрядного кода естественной единицей данных на стеке является двойное слово. Принято изображать стек в виде«стопки» двойных слов.В каждый момент времени регистр ESP указывает на верхний элемент стека. Задавая положительное смещение относительно ESP, можно произвольным образомобращаться к содержимому стека. Отрицательные смещения относятся к свободной памяти. После снятия данных со стека содержимое ячеек памяти не меняется,происходит только перемещение указателя стека. Но в рамках логики стека содержимое памяти, лежащей ниже того места, на которое ссылается ESP, не определено.Пример 3-1 Пересылки без MOVНа стек помещено N > 1 целых чисел n0, n1, …, nN–1.

Последний элемент последовательности – верхушка стека. Переместите n0 на верхушку стека так, чтобы в результате получилась следующая последовательность: n1, …, nN–1, n0. Дополнительныеограничения: (1) при пересылках данных из памяти или в память разрешается использовать только команды PUSH и POP, (2) не разрешается использовать дополнительную память.РешениеБудем в цикле сдвигать на один шаг вниз по стеку (и вверх по адресам) элементыпоследовательности. Элемент i будет извлекаться, а на его место будет помещать32ся элемент i+1. После того, как будет извлечен последний элемент (n0), переместим указатель стека на конец последовательности и поместим его на верхушку стека.movpop.l:poppushmovaddloopsubpushecx, N-1edxeaxedxedx, eaxesp, 4.lesp, 4*(N-1)edx;;;;;;;;;;В цикле должно выполниться N-1 записей на стекВ edx помещаем элемент i+1Начинаем тело циклаВыгружаем на eax элемент iНа его место помещаем элемент i+1Перемещаем в edx элемент iПринудительно передвигаем верхушку стекаТело цикла выполняется N-1 разВозвращаем указатель стека на последний элементКладем на верхушку стека n0Соглашение вызова cdeclЛюбое соглашение вызова функции должно определить, как будут использоватьсяразличными функциями регистры, способ передачи аргументов вызова и возвращаемого значения и т.

д. Основным соглашением вызова на платформеIA-32/Linux является cdecl со следующими правилами.Для вызова функции используется команда CALL fname, где операнд fname – метканачала вызываемой функции. Для возврата в точку вызова – команда RET.Для передачи аргументов вызова используется стек. Аргументы расположены в«обратном» порядке: в момент вызова на верхушке стека находится первый аргумент, следом за ним – второй и т. д.

Для хранения аргументов используются двойные слова. Например, для параметров типа char, short, int, long будет использовано4 байта. Для типа long long – 8 байтов.Возвращаемое значение передается в вызвавшую функцию через регистр EAX.Автоматические локальные переменные размещаются на стеке, внутри фреймавызова функции. Если регистр ESP указывает на верхушку стека, что позволяет определить нижнюю границу фрейма, то регистр EBP используется для определенияверхней границы фрейма.Регистры EAX, ECX, EDX при необходимости должны сохраняться перед вызовом ввызывающей функции. Регистры EBX, ESI, EDI при необходимости должны сохраняться вызванной функцией.

Для хранения используется память во фрейме вызовафункции (далее слово «вызов» будет опускаться для краткости изложения). Регистры ESP и EBP используются для организации работы со стеком.Код функции можно разделить на три части: пролог, тело функции и эпилог. В прологе и эпилоге происходит создание нового фрейма, сохранение прежнего значе33ния EBP, в эпилоге освобождение фрейма и восстановление EBP. На рисунке приведено распределение памяти во фрейме, границы фрейма выделены жирными линиями.Фрейм начинается с адреса возврата, помещенного на стек командой call.

Сразу заним расположен сохраненный регистр EBP, на это место памяти указывает новоезначение, помещенное в EBP во время выполнения пролога. Далее в памяти расположены (если есть такая необходимость) сохраняемые в вызванной функции регистры и автоматические локальные переменные. Нижняя часть фрейма отводитсядля аргументов вызова функций (если из данной функции что-либо вызывается).Пример 3-2 Скалярное произведениеИспользуя соглашение cdecl, реализуйте функциюпроизведение двух массивов длины len.conv,вычисляющую скалярноеint conv(int *a, int *b, int len);РешениеПриведем рисунок, на котором будет показана структура фрейма функции conv.Над адресом возврата последовательно расположены три параметра.

Их значенияизвлекаются из памяти через задание нужного смещения от регистра EBP. Под сохраненным указателем фрейма EBP расположены ячейки, в которых были сохране34ны, а затем восстановлены значения регистров ESI и EDI. Указатель стека ESP показан на момент, когда расширенный сохранением регистров пролог закончился, иначалось выполнение тела функции.Само вычисление скалярного произведения организовано следующим образом. Врегистре EAX, предварительно обнуленном, накапливается произведение.

Для обращения к элементам массива используются регистры ESI, EDI (базовые адресамассивов) и ECX (счетчик цикла). Поскольку при вычислении скалярного произведения неважен порядок обхода элементов массивов, суммируем, начиная с большихиндексов.conv:pushmovpushpushmovmovmovmov.l:movimuladdlooppoppopmovpopretebpebp,esiediedi,esi,ecx,esp;;;dword [ebp+8] ;dword [ebp+12] ;dword [ebp+16] ;eax, 0Стандартный прологСохраняем esiСохраняем ediИзвлекаем со стека первый параметр aИзвлекаем со стека второй параметр bИзвлекаем со стека третий параметр len; В eax будем накапливать скалярное произведениеedx, dword [edi+4*ecx-4]edx, dword [esi+4*ecx-4]eax, edx.lediesiesp, ebpebp; Восстанавливаем сохраненный регистр edi; Восстанавливаем сохраненный регистр esi; Стандартный эпилог35Для организации цикла была использована команда LOOP, диапазон изменения регистра ECX – от len до 1. Поэтому к базовому адресу массива прибавляется смещение вида 4*ECX-4, что обеспечивает обращение к индексам len-1 … 0.Пример 3-3 Рекурсивная функцияИспользуя соглашение cdecl, реализуйте рекурсивную функцию int P(int n), вычисляющую для неотрицательного n соответствующий элемент последовательности Падована: P(0)  P(1)  P(2)  1, P(n)  P(n  2)  P(n  3) .РешениеПоскольку функция рекурсивная, потребуется формировать фактические аргументы вызова и сохранять во фрейме результат первого вызова, т.

к. регистр EAX будет«разрушен» во время второго вызова.Во фрейме должно быть выделено 4 байта для сохранения результатов первогорекурсивного вызова, т. к. по соглашению cdecl регистр EAX может быть разрушенво время второго вызова. Помимо того, во фрейме необходимо выделить 4 байтапод пространство аргументов (в данном случае для одного аргумента). Первый ивторой вызовы будут последовательно использовать это пространство.36P:push ebpmov ebp, espsub esp, 8mov eax, dword [ebp+8]cmp eax, 2jg.recurmov eax, 1jmp .end.recur:sub eax, 2mov dword [esp], eaxcall Pmov dword [ebp-4], eaxmov eax, dword [ebp+8]sub eax, 3mov dword [esp], eaxcall Padd eax, dword [ebp-4].end:mov esp, ebppop ebpret; Стандартный пролог;;;;;;Выделяем во фрейме еще два двойных словаЗагружаем параметр n в регистрДля n большего 2 передаем управление наметку .recurОстальные случаи: P(0)=P(1)=P(2)=1Завершаем выполнение; Помещаем в пространство аргументов величину n-2; Выполняем первый рекурсивный вызов; Сохраняем результат работы первого вызова; Помещаем в пространство аргументов величину n-3; Выполняем второй рекурсивный вызов; Складываем P(n-2)+P(n-3); Стандартный эпилогПример 3-4 Восстановление прототипа функцииТело Си-функции f, использующей соглашение вызова cdecl, состоит из следующего кода.*b = x;return c - y;Компилятор сгенерировал для данного фрагмента следующий ассемблерный код.movsxmovmovmovsubmovecx,eax,ebx,edx,eax,wordbyte [ebp+8]dword [ebp+16]dword [ebp+20]dword [ebp+12]ecx[edx], bx;;;;;;(1)(2)(3)(4)(5)(6)Восстановите прототип функции f.РешениеВ приведенном фрагменте Си-кода фигурируют четыре переменные.

Поскольку всеобращения к памяти используют положительные смещения относительно EBP (+8,+12, …) можно утверждать, что в Си-коде присутствуют только формальные параметры, автоматических локальных переменных не заводилось. Осталось опреде-37лить в каком порядке параметры расположены, какие типы у параметров и возвращаемого функцией значения.Согласно соглашению, возвращаемое значение передается через регистр EAX.

Характеристики

Список файлов семинаров

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6499
Авторов
на СтудИзбе
303
Средний доход
с одного платного файла
Обучение Подробнее