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

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

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

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

она не формирует флаг CF и, следовательно, непозволяет учитывать возможный перенос.ЗадачиЗадача 2-1 Присваивание различных типовРеализовать присваивание b = a; (не более двух команд) при условии:// astatic unsigned char a;static unsigned int b;// bstatic char a;static short b;Задача 2-2 Интерпретация арифметических инструкцийВыпишите значение регистра AL в виде десятичного числа (знакового ибеззнакового), а также флаги CF, OF, ZF и SF после выполнения следующихинструкций.; a; cMOV AL, 199ADD AL, -61MOV AL, -13ADD AL, 179MOV AL, -35SUB AL, 216; dMOV AL, 2SUB AL, 200; b33Задача 2-3 Реализация вычисления арифметических выраженийПриведите фрагмент программы на ассемблере для вычисления следующихвыражений.// astatic int x, y;y = (x / y) * (x % y);// bstatic unsigned char a;static int b;b = (a - 500000) % 10;Задача 2-4 Цифры и числоПустьstatic unsigned short n; // 100 <= n <= 999Приведите фрагмент ассемблерного кода для записи в n числа, полученноговыписыванием в обратном порядке десятичных цифр исходного числа n.Задача 2-5 64 на 32Даны 64-разрядные переменные x и y.

Реализовать операции.// ax += y;// bx -= y;Задача 2-6 Быстрая арифметикаИспользуя команду LEA, реализуйтеарифметических выражений:static int a, b, c;// ac = 10 * a + b + 14;// bc = 24 * a – 15 + b;Задача 2-7 Ошибки в кодеЗачеркните инструкции, содержащие ошибки.34быстроевычислениеследующихX RESD 1ADC WORD [X], WORD [EAX]MUL AL, AHNEG CFSBB DWORD [X], 100MOV EAX, XDIV 15SUB EAX, WORD [X]MOVSX EBX, BLXCHG WORD[X], 100IDIV BYTE [EAX]MOV AL, -150IMUL EAX, 5353.Указатели и адресная арифметикаВзятие адреса и разыменованиеСтатические переменные располагаются в одной из секций статических данных;если у переменных не происходит инициализация при объявлении, торасположить их допустимо в секции .bss.

В языке ассемблера адрес статическойпеременной – ее символическое имя. Это имя необходимо присвоить переменнойxp.static int *xp;static int x;xp = &x;section .bssxp resd 1x resd 1section .textmovdword [xp], xОтображение оператора разыменования в язык ассемблераРасполагаем все переменные в сегменте статической памяти .bss.static int *xp;static int x, y;x = *xp;*xp = y;section .bssxp resd 1x resd 1y resd 1section .textmov edx, dword [xp]mov eax, dword [edx]mov dword [x], eaxmov eax, dword [y]mov dword [edx], eax36;;;;помещаем в EDX значение переменной xpпомещаем в EAX значение ячейкипамяти, на которую ссылается xpприсваиваем это значение x;;;;;помещаем в EAX значение переменной yв регистре EDX уже находится значениепеременной xp.

Это значениеиспользуется как адрес, по которомубудет записано содержимое EAXПример 3-1 Двукратное разыменованиеДана статическая переменная p:static int **p;Требуется на языке ассемблера написать фрагмент программы, который вычисляетвыражение **p + 1 и печатает его значение на стандартный вывод, используямакрокоманду PRINT_DEC.РешениеЗаданное выражение предполагает двойное разыменование указателя иувеличение полученного значения на единицу.%include 'io.inc'section .textglobal CMAINCMAIN:MOV EAX, DWORD [p]MOVEAX, DWORD [EAX]MOV EAX, DWORD [EAX]INC EAXPRINT_DEC EAXXOR EAX, EAXRET;;;;;;;;;;Записываем в регистр EAX значениепеременной pИспользуем это значения для доступак памяти, теперь в регистре EAXне p, а *pПовторяем – теперь в EAX находится **pУвеличиваем это значение на единицуПечатаемПример 3-2 Разыменование и побочные эффектыДан фрагмент кода на языке Си.static short *px, *py;...*px++ = --*py;Требуется привести эквивалентную программу на языке ассемблера.РешениеВ первую очередь требуется определить, какие данные должны быть определеныв ассемблерной программе.

Во фрагменте Си-кода объявлены две переменныетипа short*. Несмотря на то, что тип short занимает два байта, указатель будет37занимать четыре байта, поскольку адресация в IA-32 32-х разрядная, т.е. под адреспамяти необходимы 4 байта. Выписываем следующие директивы ассемблераNasm:section .bsspx resd 1py resd 1Статические переменные располагаются в секциях статических данных. Посколькунет кода инициализации этих переменных, их допустимо разместить в секциистатических неинициализированных данных .bss, в противном случаепеременные были бы объявлены и проинициализированы в секции .data.Для того чтоб было проще корректно реализовать на ассемблере заданноевыражение, преобразуем его, избавившись от побочных эффектов.

Помимо того,расставим скобки для явного указания порядка выполняемых операций.*px++ = --*py;*(px++) = --(*py);--(*py);*px = *py;px++;*py = *py – 1; // (1)*px = *py;// (2)px = px + 1; // (3)Теперь последовательно переводим каждый оператор в соответствующий код наязыке ассемблера.38section .textmov eax, dword [py] ; (1) записываем в регистр eax значение;переменной pydec word [eax];уменьшаем на единицу 16-разрядную;величину, которую адресует регистр;eax, т.е. переменная pymov cx, word [eax] ; (2) записываем в регистр cx эту измененную;величинуmov eax, dword [px] ;записываем в регистр eax значение;переменной pxmov word [eax], cx ;используя это значение, записываем в;то место памяти, которое адресуется;указателем px, текущее значение *pyadd dword [px], 2; (3) Увеличиваем указатель px.

Согласно;правилам адресной арифметики языка Си;значение указателя будет увеличено на;1 * sizeof(short), т.е на 2Пример 3-3 Восстановление кодаФункция, имеющая следующий прототипvoid decode1(int *xp, int *yp, int *zp)была скомпилирована в ассемблерный код. Тело функции выглядит следующимобразом.movmovmovmovmovmovmovmovmovedi, dword [ebp + 8]edx, dword [ebp + 12]ecx, dword [ebp + 16]ebx, dword [edx]esi, dword [ecx]eax, dword [edi]dword [edx], eaxdword [ecx], ebxdword [edi], esi;;;;;;;;;(1)(2)(3)(4)(5)(6)(7)(8)(9)Параметры xp, yp и zp находятся в памяти по смещениям 8, 12 и 16 относительноадреса, содержащегося в регистре ebp.

Напишите код тела функции decode1 наязыке Си, который был бы эквивалентен представленному ассемблерному коду.РешениеВ первых трех инструкциях выполнилась загрузка значений формальныхпараметров функции на регистры.39mov edi, dword [ebp + 8] ; (1) edi ← xpmov edx, dword [ebp + 12] ; (2) edx ← ypmov ecx, dword [ebp + 16] ; (3) ecx ← zpВ следующих трех инструкциях эти регистры использовались для доступа ксодержимому памяти, т.е.

параметры-указатели разыменовывались, исоответствующие значения из памяти пересылалась в регистры ebx, esi, eax.mov ebx, dword [edx]mov esi, dword [ecx]mov eax, dword [edi]; (4) ebx ← *yp; (5) esi ← *zp; (6) eax ← *xpВ последних трех инструкциях регистры edi, edx, ecx, содержащие адреса, сноваиспользовались для доступа к памяти, но в этот раз происходила запись техзначений, которые были ранее размещены на регистрах ebx, esi, eax.mov dword [edx], eaxmov dword [ecx], ebxmov dword [edi], esi; (7) *yp ← eax ← *xp; (8) *zp ← ebx ← *yp; (9) *xp ← esi ← *zpЕсли ввести три вспомогательные переменныесчитываемых из памяти, получим следующий Си-код.дляхранениязначенийvoid decode1(int *xp, int *yp, int *zp) {int y = *yp;int z = *zp;int x = *xp;*yp = x;*zp = y;*xp = z;}Переменная y соответствует ebx, z – esi, x – eax.Указатели и массивыВ языке Си обращение к указателям и массивам происходит единообразно.

К нимможно применять адресную арифметику и индексное выражение. Однако имеетсясущественное отличие в ассемблерном коде, реализующем текстуальноодинаковые выражения. Отличие обусловлено тем, как выделятся память приобъявлении указателей и массивов.40Пример 3-4 Адресная арифметика и массивыДля приведенного фрагмента Си-кода требуется написать соответствующийфрагмент ассемблерной программы.static short *p;static short a[3];…p[1] = *(а + 2);РешениеВ приведенном фрагменте массив используется как указатель, а указатель – какмассив, с индексным выражением. Тем не менее, ассемблерный код будетотражать особенности фактического выделения памяти.

На рисунке ниже показанораспределение данных в памяти: черные линии показывают группировку байт вбазовые типы, серым цветом показаны выделенные байты. Снизу памяти данныеподписаны в терминах языка Си, сверху – адреса, используемые в ассемблерномкоде.Память выделена для указателя p, но не для тех ячеек, на которые он указывает.Поэтому, что вычислить адрес первого элемента последовательности int-ов, накоторые указывает p, необходимо загрузить адрес (значение переменной p) изпамяти в регистр. В случае с массивом память была выделена для всех элементов,а имя массива интерпретируется как адрес начала выделенной памяти. Поэтомупри извлечении элемента с индексом два имя массива следует сразу жеиспользовать в адресном коде в качестве базы.movdx, word [а + 4]movmoveax, dword [p]word [eax + 2], dx;;;;;;*(а + 2) – то же, что и a[2]a – адрес, начиная с которогов памяти размещены элементы массиваЗначение переменной p – адрес,который указывает на началомассива41Пример 3-5 Массив указателейДля приведенного фрагмента Си-кода требуется написать соответствующийфрагмент ассемблерной программы.static int *p[10];static int x;x = *p[8] + 1;РешениеВ первую очередь определим, как данные были расположены в памяти.Элементами массива p являются указатели на целые числа.

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

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

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