Главная » Просмотр файлов » 7_Язык Ассемблера

7_Язык Ассемблера (975804), страница 10

Файл №975804 7_Язык Ассемблера (В.Г. Баула - Введение в архитектуру ЭВМ и системы программирования) 10 страница7_Язык Ассемблера (975804) страница 102019-04-28СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Команды вызова процедуры и возврата из процедурыКоманды вызова процедуры по-другому называются командами перехода с запоминаниемточки возврата,1 что более правильно, так как их можно использовать и вообще без процедур. Посвоей сути это команды безусловного перехода, которые перед передачей управления в другое место программы запоминают в стеке адрес следующей за ними команды. Таким образом, обеспечивается возможность возврата в точку программы, следующую непосредственно за командой вызовапроцедуры. На языке Ассемблера эти команды имеют следующий вид:call op1где op1 может иметь следующие форматы: i16, r16, m16, m32 и i32. Как видим, по сравнению скомандой обычного безусловного перехода jmp op1 здесь не реализован близкий короткий относительный переход call i8 , он практически бесполезен в практике программирования, так какпочти всегда процедура находится достаточно далеко от точки её вызова.

Следовательно, как и команды безусловного перехода, команды вызова процедуры бывают близкими (внутрисегментными,где op1 форматов i16, r16, m16) и дальними (межсегментными, где op1 форматов m32 и i32).Близкий вызов процедуры выполняется по следующей схеме:Встек(IP); jmp op1Здесь запись Встек(IP) обозначает действие "записать значение регистра счётчика адреса IP встек". Заметим, что это часть действия при вызове процедуры, а отдельной команды push IP вязыке нашей машины нет.

Дальний вызов процедуры выполняется по схеме:Встек(CS); Встек(IP); jmp op1Для возврата на команду программы, адрес которой находится на вершине стека, предназначенакоманда возврата из процедуры, по сути, это тоже команда безусловного перехода. Команда возврата из процедуры имеет следующий формат:ret [i16]; Операнд в Ассемблере может быть опущенНа языке машины у этой команды есть две модификации, отличающиеся кодами операций:близкий и дальний возврат из процедуры.

Нужный код операции выбирается программой Ассемблера автоматически, по контексту использования команды возврата, о чём мы будем говорить далее.Если программист опускает беззнаковый параметр этой команды i16, то Ассемблер автоматическиполагает операнд i16=0.Команда близкого возврата из процедуры выполняется по схеме:Изстека(IP); SP:=(SP + i16)mod 216Здесь, по аналогии с командой вызова процедуры, запись Изстека(IP) обозначает действие"считать из стека слово и записать его в регистр IP".Команда дальнего возврата из процедуры выполняется по схеме:Изстека(IP); Изстека(CS); SP:=(SP + i16)mod 216По нашей классификации переходов команда ret осуществляет близкий или дальний абсолютный косвенный переход. Дополнительной действие команды возврата SP:=(SP + i16)mod 216 приводит к тому, что для параметра i16<>0 указатель вершины стека SP устанавливается на некотороедругое место в стеке.

В большинстве случаев этот операнд имеет смысл использовать для чётныхi16>0, и только тогда, когда SP+i16<=N, где N – размер стека в байтах. В этом случае из стекаудаляются i16 div 2 слов, что можно трактовать как очистку стека от данного количестваслов. Возможность очистки стека при выполнении команды возврата, как мы вскоре увидим, будетвесьма полезной при программировании процедур на Ассемблере, она будет аналогом уничтожениялокальных переменных Паскаля при выходе из процедуры.1В некоторых книгах по Ассемблеру такие команды называют "командами перехода с возвратом", что,конечно, не совсем правильно, так как сами эти команды никакого "возврата" не производят.327.10.

Программирование процедур на АссемблереВ языке Ассемблера1 есть понятие процедуры – это участок программы, который начинается директивой<имя процедуры> proc [<спецификация процедуры>]и заканчивается директивой<имя процедуры> endpПервое предложение будем называть заголовком процедуры. Все предложения Ассемблера между директивами заголовка и конца процедуры называются телом этой процедуры. Синтаксис Ассемблера допускает, чтобы тело процедуры было пустым, т.е. не содержало ни одного предложения.Вложенность процедур одна в другую, в отличие от языка Паскаль, не допускается.

Заметьте также, что, в отличие от Паскаля, имена не локализованы в теле процедуры, т.е. они видны из любойточки программного модуля (мы рассмотрим исключение из этого правила при изучении макросредств Ассемблера). Учтите также, что имя процедуры имеет тип метки, хотя за ним и не стоитдвоеточие, как это принято для меток команд.

Вызов процедуры обычно производится командойcall, а возврат из процедуры – командой ret.Спецификация процедуры является необязательным параметром заголовка процедуры, она задаётся служебными именами near или far. Эти имена являются служебными именами констант,far=–2 и near=–1.2 Отметим и другие полезные служебные имена констант в языке Ассемблера:byte=1, word=2, dword=4, abs=0. Если спецификация в заголовке процедуры опущена, то имеется в виду ближняя (near) процедура.

Спецификация процедуры – это единственный способ повлиять на выбор Ассемблером конкретного кода операции для команды возврата ret внутри этой процедуры: для близкой процедуры это будет близкий возврат, а для дальней – дальний возврат. Отметим, что команду ret, вообще говоря, можно использовать и вне тела процедуры, в этом случае Ассемблер выбирает команду близкого возврата.Заметим, как при снижении уровня языков программирования упрощаются их основные понятия.

Так, в Паскале у нас было описание и вызов процедур и функций (да ещё и с развитым механизмом формальных и фактических параметров). На языке Ассемблера у нас остаётся только описаниепроцедуры, а о том, что некоторая процедура "на самом деле" является не процедурой, а функцией,знает только сам программист, но не программа Ассемблер. Также в языке Ассемблер нет понятияформальных и фактических параметров процедуры, и нам придётся моделировать этот механизмпри программировании. Кроме того, по сравнению с Паскалем, само понятие процедуры в Ассемблере резко упрощается. Чтобы продемонстрировать это, рассмотрим такой синтаксически правильный фрагмент программы:mov ax,1Fprocadd ax,axFendpsub ax,1Этот фрагмент полностью эквивалентен таким трём командам:mov ax,1F:add ax,axsub ax,1Другими словами, описание процедуры на Ассемблере может встретиться в любом месте сегмента, это просто некоторый фрагмент кода, заключённый между директивами начала proc и концаendp описания процедуры.31Заметьте, что в самом машинном языке понятие процедуры отсутствует, а команда call, как уже говорилось, является просто командой безусловного перехода с запоминанием в стеке адреса следующей за ней команды.

О том, что эта команда используется именно для вызова процедуры, знает только сам программист.2К сожалению, по непонятным причинам Ассемблер MASM 4.0 не позволяет писать заголовок процедурыв виде proc -1 , а требует писать proc near , хотя в других местах программы имена near и far полностью эквивалентны константам -1 и -2 соответственно.3Замечание для продвинутых читателей: примерно такие же процедуры были в некоторых первых примитивных языках высокого уровня, например, в начальных версиях языка Basic.33Аналогично, команда call является просто особым видом команды безусловного перехода, иможет не иметь никакого отношения к описанию процедуры.

Например, рассмотрим следующийсинтаксически правильный фрагмент программы:L:mov ax,1. . .call LЗдесь вместо имени процедуры в команде call указана обычная метка. И, наконец, отметим,что в самом языке машины уже нет никаких процедур и функций, а также передачи параметров, ипрограммисту приходится моделировать все эти понятия.Изучение программирования процедур на Ассемблере начнём со следующей простой задачи, вкоторой "напрашивается" использование процедур. Пусть надо ввести массивы X и У знаковых целых чисел размером в слово, массив X содержит 100 чисел, а массив Y содержит 200 чисел.

Затемнеобходимо вычислить величину Sum:100200i =1i =1Sum := ∑ X[i] + ∑ Y[i]Будем предполагать, что оба массива находятся в одном сегменте данных (на него, как обычно,указывает регистр DS), а переполнение результата при сложении элементов массивов будем для простоты игнорировать (т.е. выводить неправильный ответ без выдачи об этом диагностики). Для данной программы естественно сначала реализовать процедуру суммирования элементов массива и затем дважды вызывать эту процедуру соответственно для массивов X и Y. Текст нашей процедурымы, как и в Паскале, будем располагать перед текстом основной программы (первая выполняемаякоманда программы, как мы знаем, помечено меткой, указанной в директиве end нашего модуля),хотя с таким же успехом процедуру можно было бы располагать и в конце программного сегмента,после макрокоманды finish.Заметим, что, вообще говоря, мы будем писать функцию, но в языке Ассемблера, как уже упоминалось, различия между процедурой и функцией не синтаксическое, а чисто семантическое.

Другими словами то, что это функция, а не процедура, знает программист, но не программа Ассемблера,поэтому далее мы часто будем использовать для этой цели обобщённый термин процедура.Перед тем, как писать процедуру, необходимо составить соглашение о связях между основнойпрограммой и процедурой. Здесь необходимо уточнить, что под основной программой мы имеем ввиду то место нашей программы, где процедура вызывается по команде call. Таким образом, вполне возможен и случай, когда одна процедура вызывает другую, в том числе и саму себя, используяпрямую или косвенную рекурсию (напомним, что при прямой рекурсии процедура вызывает себясама непосредственно, а при косвенной – через цепочку других процедур).Соглашение о связях между основной программой и процедурой включает в себя место расположения и способ передачи параметров, способ возврата результата работы (для функции) и некоторую другую информацию.

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

Тип файла
PDF-файл
Размер
751,57 Kb
Тип материала
Высшее учебное заведение

Список файлов книги

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