Chapter_07 (1110559), страница 10

Файл №1110559 Chapter_07 (Книга с сайта Баулы по главам) 10 страницаChapter_07 (1110559) страница 102019-04-28СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Ниже приведено возможное решение этой задачи.include io.asmstack segment stackdb128 dup (?); это запас для системных нуждdw300 dup (?); это для хранения наших чиселstack endscode segmentassume cs:code,ds:code,ss:stackT1db'Вводите числа до нуля$'T2db'Числа в обратном порядке:',10,13,'$'T3db'Ошибка – много чисел!',10,13,'$'program_start:movax,codemovds,axmovdx,offset T1; Приглашение к вводуoutstrnewlinesubcx,cx; хороший способ для cx:=0L:inint axcmpax,0; проверка конца вводаjePech; на вывод результатаcmpax,2jbLcmpax,100jaL;проверка диапазона [2..100]cmpcx,300; в стеке уже 300 чисел ?jeErrpush ax; запись числа в стекinccx; счетчик количества чисел в стекеjmpLPech: jcxz Kon; нет чисел в стекеmovdx,offset T2outstrL1:popaxoutword ax,10; ширина поля вывода=10loop L1Kon: finishErr: movdx,T3outstrfinishcode endsend program_startЗаметим, что в нашей программе нет собственно переменных, а только строковые константы,поэтому мы не описали отдельный сегмент данных, а разместили эти строковые константы в кодовом сегменте, на начало которого установили сегментный регистр CS.

Можно считать, что сегментыданных и кода в нашей программе в некотором смысле совмещены. Мы разместили строковые константы в самом начале сегмента кода, перед входной точкой программы, но с таким же успехомможно разместить эти строки и в конце кодового сегмента после последней макрокоманды finish.Обратите внимание, как мы выбрали размер стека: 128 байт мы зарезервировали для системныхнужд (как уже упоминалось, стеком будут пользоваться и другие программы, подробнее об этом будет рассказано далее) и 300 слов мы отвели для хранения вводимых нами чисел. При реализацииэтой программы, анализируя переполнение стека, мы использовали команды:cmp cx,300; в стеке уже 300 чисел ?jeErrКак уже отмечалось выше, это можно сделать и командами31cmp SP,128; только "неприкосновенный запас"?jbErrТеперь, после того, как мы научились работать с командами записи слов в стек и чтения слов изстека, вернёмся к дальнейшему рассмотрению команд перехода.7.9. Команды вызова процедуры и возврата из процедурыКоманды вызова процедуры по-другому называются командами перехода с запоминаниемточки возврата,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.Заметим, что, вообще говоря, мы будем писать функцию, но в языке Ассемблера, как уже упоминалось, различия между процедурой и функцией не синтаксическое, а чисто семантическое.

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

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

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

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