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

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

PDF-файл Семинары по курсу «Архитектура ЭВМ и язык ассемблера» учебно-методическое пособие. Часть 2. - Е.А. Кузьменкова_ В.А. Падарян_ М.А. Соловьев, страница 9 Архитектура ЭВМ (36554): Семинары - 2 семестрСеминары по курсу «Архитектура ЭВМ и язык ассемблера» учебно-методическое пособие. Часть 2. - Е.А. Кузьменкова_ В.А. Падарян_ М.А. Соловьев: Архитект2019-04-28СтудИзба

Описание файла

PDF-файл из архива "Семинары по курсу «Архитектура ЭВМ и язык ассемблера» учебно-методическое пособие. Часть 2. - Е.А. Кузьменкова_ В.А. Падарян_ М.А. Соловьев", который расположен в категории "". Всё это находится в предмете "архитектура эвм" из 2 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .

Просмотр PDF-файла онлайн

Текст 9 страницы из PDF

Постройте такой эксплойт, чтобы в результате его обработки функция gвозвращала управление на адрес 0xdabbad00.int g(int i, int val, int dest) {int *lp;int buf[3];buf[i] = val;*lp = dest;return *lp + buf[i];}g:pushmovsubmovmovmovmovmovmovmovmovmovmovlealeaveretebpebp, espesp, 16eax, dword [ebp+8]edx, dword [ebp+12]dword [ebp-12+eax*4], edxeax, dword [ebp-16]edx, dword [ebp+16]dword [eax], edxeax, dword [ebp-16]edx, dword [eax]eax, dword [ebp+8]eax, dword [ebp-12+eax*4]eax, [edx+eax]594.Различные соглашения вызова функцийОптимизация вызова функцийДеление программы на функции упрощает разработку (и делает в принципе возможным разрабатывать большие программы), но вносит накладные расходы наорганизацию вызова функций. Компилятор по возможности оптимизирует эти расходы, как с помощью классических оптимизаций кода, так и применением болееэффективных соглашений вызова.После того, как была завершена отладка программы и она собирается с включенной оптимизацией, появляется возможность отказаться от использования указателя фрейма (“omit frame pointer”): все обращения к содержимому стека выполняются только через регистр ESP, что делает дальнейшую отладку затруднительной.

Затос точки зрения эффективности такой подход дает два преимущества: (1) исчезаетнеобходимость сохранять и восстанавливать EBP в прологе и эпилоге функции, и (2)у компилятора появляется дополнительный регистр для организации вычислений.Еще одна возможность улучшить производительность кода появляется в случае,когда формальных параметров достаточно мало. Тогда их можно передавать нечерез память (стек), а через сохраняемые в вызывающей функции регистры(fastcall). Общего стандарта на такой способ вызова функций нет, но компиляторыGCC и Microsoft используют схожие правила.Пример 4-1 “Omit frame pointer”Реализуйте заданную функцию на языке ассемблера для платформы IA-32/Linux.Дополнительные требования: (1) реализация должна использовать рекурсивныйвызов, (2) код должен отражать особенности компиляции с ключом-fomit-frame-pointer.typedef struct t_link {short payload;struct t_link *next;} link;int f(link* chain) {return chain? chain->payload + f(chain->next) : 0;}РешениеПоскольку необходимо организовывать рекурсивный вызов, придется помещатьдвойное слово на стек.

Будем делать это непосредственно перед рекурсивным вызовом, а сразу после вернем указатель стека на место. Таким образом, при вычис60лении выражений ESP будет указывать на адрес возврата, а формальный параметрдостижим по адресу ESP+4.f:movtestjzeax, dword [esp+4]eax, eax; Проверяем, не 0 ли указатель chain.false; Если 0 – сразу выходим, eax уже содержит нужное; числоpush [eax+4]; Кладем на стек chain->nextcall f; Рекурсивный вызовaddesp, 4; Очищаем стек от фактического аргументаmovecx, dword [esp+4] ; Берем параметр chainmovsx ecx, word [ecx]; Расширяем chain->payload до типа intaddeax, ecx; Добавляем ecx к тому, что вернул рекурсивный; вызов.false:retПример 4-2 Соглашение fastcallРеализуйте приведенный ниже Си-код.

Дополнительные требования: (1) реализация должна использовать рекурсивный вызов, (2) код должен отражать особенности компиляции с ключом -fomit-frame-pointer.#include <stdio.h>typedef struct t_dlink {intpayload;struct t_dlink *next;struct t_dlink *prev;} dlink;__attribute__((fastcall)) void f(dlink *p, _Bool direction) {if (!p) {return;}if (p->payload) {printf("Payload %d @ link %p\n", p->payload, (void*)p);} else {if (direction) {p = p->next;} else {p = p->prev;}f(p, direction);}}РешениеСоглашение fastcall предполагает передачу первого параметра через регистр ECX,второго – через EDX (если размера регистров хватает для их размещения). В данном61случае указатель p передается через ECX, а direction – через EDX (более точно – через DL).

Для вызова printf на стеке потребуется 3 двойных слова. Для рекурсивноговызова f на стеке ничего размещать не придется, аргументы должны быть помещены в ECX и EDX, причем второй регистр обновлять не требуется. В свою очередьECX должен быть перезаписан адресом, считанным из ячейки с адресом либо ECX+4,либо ECX+8.section .rodata.LC0 db `Payload %d @ link %p\n`, 0 ; форматная строка для функции printfsection .textf:testecx, ecxjz.L6moveax, dword [ecx]testeax, eaxjnz.L8testdl, dljnz.L9movecx, dword [ecx+8]jmp.L5.L9:movecx, dword [ecx+4].L5:callfret.L8:subesp, 12movdword [esp+8], ecxmovdword [esp+4], eaxmovdword [esp], .LC0callprintfaddesp, 12.L6:ret; eax : p->payload; Если direction == false; ecx : p = p->prev; Если direction == true; ecx : p = p->next;;;;;;;Рекурсивный вызов с подготовленнымиecx и edxСюда попадаем, когда p->payload != 0Выделяем место под три аргумента:Третий аргумент ecx : pВторой аргумент eax : p->payloadПервый аргумент – форматная строка; Освобождаем место аргументовОчистка стека от аргументов вызоваСоглашение cdecl предполагает, что вызывающая функция размещает фактическиеаргументы на стеке, а потом освобождает стек.

Другое соглашение вызова – stdcallпредписывает вызванной функции самой освободить место на стеке, занятое еепараметрами. Это соглашение используется при вызове функций Win32 API ОСWindows. Возврат из функции делается командой RET N, где N – число освобождаемых байтов на стеке, помимо адреса возврата. В качестве N используют суммарныйразмер памяти на стеке, занятой аргументами вызова.

Как следствие, это соглашение не позволяет реализовывать функции с переменным числом параметров, передаваемых по значению через стек.Еще одной ситуацией, когда вызванная функция очищает стек от параметров, является возврат из функции структуры в компиляторе GCC. В такой ситуации задей62ствуются правила, из-за которых реализацию cdecl в GCC называют гибридной. Поскольку значение структуры имеет произвольный размер, для его возврата в общем случае регистра EAX не хватает. Компилятор при вызове такой функции помещает первым на стек служебный параметр – адрес памяти, в которой должно бытьразмещено содержимое структуры. При выходе из функции этот служебный параметр освобождается командой RET 4.

Если вызывающая функция изначально разметила стек так, что этот служебный параметр находится внутри ее фрейма, то принеобходимости будет добавлен код компенсации, возвращающий ESP на должноеместо, нижнюю границу фрейма.Пример 4-3 Соглашение stdcallРеализуйте на языке ассемблера заданную функцию.unsigned __attribute__((stdcall)) f(unsigned x, unsigned y, int pos) {unsigned t = ~(x & y) & (1 << pos);return t;}РешениеЕдинственной особенностью функции будет то, что в момент выхода из нее со стека будет дополнительно снято 12 байтов – память, занятая фактическими аргументами вызова.f:pushmovebpebp, espmovandnotmovmovsalandedx,edx,edxeax,ecx,eax,eax,popretebp12; Стандартный прологdword [ebp+12]dword [ebp+8] ;x & y; ~(x & y)1dword [ebp+16]cl; 1 << posedx; ~(x & y) & (1 << pos); Восстанавливаем ebp; Возвращаемся и очищаем три двойных словаПример 4-4 Передача структуры в функцию в качестве параметраРеализуйте на языке ассемблера заданную функцию.63#include <stdlib.h>typedef struct t_pair {int x;int y;} pair;link* h(pair data) {link *p = (link*)malloc(sizeof(link));p->payload = data;p->next = (link*)0;return p;}typedef struct t_link {pair payload;struct t_link *next;} link;РешениеПеред вызовом функции malloc стек должен быть выровнен по 16-байтной границе: 4 байта заняты адресом возврата, в 4 байтах сохранен EBP, 4 байта пропущены ине используются, 4 байта – аргумент функции malloc.h:pushmovsubpushcallmovmovmovmovmovleaveretebpebp, espesp, 412mallocecx, dword [ebp+12]edx, dword [ebp+8]dword [eax+4], ecxdword [eax], edxdword [eax+8], 0; В eax – адрес выделенной памяти; Копируем data по частям, а именно по; отдельным полям; Заполняем последнее поле p->next = (link*)0Структуры передаются в функцию по значению: на стеке будет выделено место(кратное 4 байтам), достаточное для того, что бы скопировать в него всю структуру.Размер pair – 8 байтов, содержимое параметра data будет располагаться сразу после адреса возврата.

Поскольку структура состоит всего из двух полей типа int, об-64ращения к ним происходят по смещениям EBP+8 и EBP+12, что принципиально неотличимо от ситуации, когда в функцию передаются два параметра типа int.Следует отметить, что если бы размеры полей были по 2 байта (например, типshort), размещение данных на стеке станет характерным для структуры. При передаче параметров для каждого из них выделятся память кратная 4 байтам. В случае,когда используются два параметра типа short, для них выделяется по 4 байта(двойное слово), причем 2 старших байта в каждом двойном слове будут использоваться в качестве заполнителя для выравнивания параметров. Для одного параметра – структуры будет выделено 4 байта, которые будут все заполнены содержимым структуры.Пример 4-5 Возвращаемое значение – структураРеализуйте на языке ассемблера заданную функцию.typedef struct t_pair {int x;int y;} pair;typedef struct t_link {pair payload;struct t_link *next;} link;pair f(link* p, int tres) {while (p) {int dist = p->payload.x - p->payload.y;if (dist < 0) {dist = -dist;}if (tres < dist) {return p->payload;}p = p->next;}return (pair){0, 0};}65РешениеОсновным изменением, по сравнению с привычным соглашением cdecl, будет то,что на стеке, непосредственно выше адреса возврата появится неявный служебныйпараметр, помещенный туда компилятором.

Через этот параметр будет передаваться адрес для возвращаемого значения, являющегося структурой. Где именнобудет выделена память под возвращаемое значение – «забота» вызывающейфункции.По завершении работы вызванной функции управление возвращается командойRET 4, которая освободит стек от служебного параметра, оставив на нем только те,что явно заданы пользователем в объявлении функции.66f:pushmovpushmovmovmovjmp.L5:movsubjgeneg.L4:cmpjgemovmovmovmovjmp.L3:mov.L2:testjnemovmov.L1:poppopretebpebp, espesieax, dword [ebp+8]; Стандартный для соглашения cdecl пролог;;;edx, dword [ebp+12] ;esi, dword [ebp+16] ;.L2;;ecx, dword [edx];ecx, dword [edx+4] ;.L4ecx;Регистр esi будет использоваться в вычисленияхНеявный служебный параметр – адрес длявозвращаемого значенияПараметр link* pПараметр int tresСразу переходим на проверку условия whileНачало тела циклаecx| p->payload.xecx| p->payload.x - p->payload.yЕсли число в ecx отрицательное – меняем знакesi, ecx.L3ecx, dword [edx+4]edx, dword [edx]dword [eax+4], ecxdword [eax], edx.L1; Сравниваем tres и модуль разностиedx, dword [edx+8]; edx| p = p->nextedx, edx.L5dword [eax], 0dword [eax+4], 0; Проверка условия цикла while: продолжаем; итерироваться, пока edx|p не равно нулю; Возвращаемое значение – (pair){0, 0}esiebp4;;;;;Возвращаем p->payload.

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