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

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

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

Эту команду называют префиксом (замены) сегмента, такчто на языке машины у нас будут две последовательные, тесно связанные1 команды:es: mov Y[bx],axВ цикле суммирования произведений для доступа к элементам массивов мы использовали другой приём, чем при вводе – регистры-указатели bx и si, в этих регистрах находятся адреса очередных элементов массивов. Напомним, что адрес – это смещение элемента относительно начала сегмента (в отличие от индекса элемента – это смещение от начала массива).При записи команды умножениеmul word ptr es:[si]; умножение на Y[N-i+1]мы вынуждены явно задать размер второго сомножителя и записать префикс сегмента es:, так какпо виду операнда [si] Ассемблер не может сам "догадаться", что это элемент массива Y размеромв слово и из сегмента data2 (директива assume здесь нам, к сожалению, помочь не сможет).В командеadd bx,type X; это bx:=bx+2для задания размера элемента массива мы использовали оператор type.

Параметром этого оператора является имя из нашей программы, значением оператора type <имя> является целое число –тип данного имени. Для имён областей памяти значение типа – это длина этой области в байтах (учтите, что для массива это почти всегда длина одного элемента, а не всего массива!), для меток команд это отрицательное число –1, если метка расположена в том же модуле, что и оператор type,или отрицательное число –2 для меток из других модулей.2 Все другие имена (в частности, именарегистров и сегментов), а также имена констант, имеют тип ноль.

В остальных случаях попытка использовать этот оператор без имени (например, type [bx] ) либо вызовет в нашем Ассемблересинтаксическую ошибку (например, в макрооператоре3 присваивания K=type [bx] – ошибка),либо оператор type будет проигнорирован (например, mov ax,type [bx] ≡ mov ax,[bx] ).Вы, наверное, уже почувствовали, что программирование на Ассемблере сильно отличается отпрограммирования на языке высокого уровня (например, на Паскале). Чтобы подчеркнуть это различие, рассмотрим пример задачи, связанной с обработкой матрицы, и решим её на Паскале и на Ассемблере.Пусть дана матрица целых чисел и надо найти сумму элементов, которые расположены в строках, начинающихся с отрицательного значения. Для решения этой задачи на Паскале можно предложить следующий фрагмент программыConst N=20; M=30;VarX: array[1..N,1..M] of integer;Sum,i,j: integer;Begin{ Ввод матрицы X }Sum:=0;1Мы называем эту пару команд тесно связанными, потому что они одновременно выбираются для исполнения на регистр команд, и при счёте между ними никогда не происходит прерывания выполнении программы,подробнее об этом поговорим в разделе, посвящённом системе прерываний.2Мы уже упоминали, что программа на Ассемблере может состоять из отдельных модулей, подробно обэтом мы будем говорить в главе "Модульное программирование".3Об этом операторе мы будем говорить в отдельной главе, посвящённой макросредствам Ассемблера.24for i:=1 to N doif X[i,1]<0 thenfor j:=1 to M do Sum:=Sum+X[i,j];Для переноса программы с языка высокого уровня (в нашем случае с Паскаля) на язык низкогоуровня (Ассемблер) необходимо выполнить два преобразования, которые в программистской литературе часто называются отображениями.

Как говорят, надо отобразить с языка высокого уровняна язык низкого уровня структуру данных и структуру управления программы. В нашем примереглавная структура данных в программе на Паскале – это прямоугольная таблица (матрица) целых чисел.

При отображении матрица на линейную память некоторого сегмента данных в Ассемблере приходится, как говорят, линеаризировать матрицу. Этим мудрёным термином обозначают совсемпростой процесс: сначала в сегменте данных размещается первая строка матрицы, сразу вслед на ней– вторая, и т.д. Для нашего примера в некотором сегменте надо каким-то образом зарезервировать2*N*M байт памяти.

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

Кроме того, надо сказать, что некоторые языки программирования высокого уровня требуют другого способа линеаризации. Например, для языка Фортран нужно сначаларазместить в памяти сегмента первый столбец матрицы, потом второй и т.д.Теперь займёмся отображением структуры управления нашей программы на Паскале (а попросту говоря – её условных операторов и циклов) на язык Ассемблера. Сначала обратим внимание нато, что переменные i и j несут в нашей программе на Паскале двойную нагрузку: это одновременнои счётчики циклов, и индексы элементов массива.

Такое совмещение функций упрощает пониманиепрограммы и делает её очень компактной по внешнему виду, но не проходит даром. Теперь, чтобыпо индексам элемента массива вычислить его адрес в сегменте данных, приходится выполнить достаточно сложные действия. Например, адрес элемента X[i,j] компилятору с Паскаля приходитсявычислять так:Адрес(X[i,j]) = Адрес(X[1,1])+2*M*(i-1)+2*(j-1)Эту формулу легко понять, учитывая, что для Ассемблера матрица хранится в памяти компьютера по строкам (сначала первая строка, затем вторая и т.д.), и каждая строка имеет длину 2*M байт.Буквальное вычисление адресов элементов по приведённой выше формуле (а именно так чаще всегои делает Паскаль-машина) приводит к весьма неэффективной программе.

При отображении этихциклов на язык Ассемблера лучше всего разделить функции счётчика цикла и индекса элементов. Вкачестве счётчика будем использовать регистр cx (он и специализирован для этой цели), а адресаэлементов матрицы лучше хранить в индексных регистрах (bx, si и di). Исходя из этих соображений, можно так переписать программу на Паскале, предвидя её будущий перенос на Ассемблер.Const N=20; M=30; Sum: integer=0;VarX: array[1..N,1..M] of integer;cx,oldcx: integer; bx: ↑integer;Begin{ Ввод матрицы X }bx:=↑X[1,1]; {Так в Паскале нельзя}1for cx:=N downto 1 doif bx↑<0 then begin oldcx:=cx;for cx:=M downto 1 do beginSum:=Sum+bx↑; bx:=bx+2 {Так в Паскале нельзя}end;cx:=oldcxendelse bx:=bx+2*M {Так в Паскале нельзя}Теперь осталось переписать этот фрагмент программы на Ассемблере:1В языке Турбо-Паскаль вместо недопустимого оператора bx:=↑X[1,1]; можно использовать операторприсваивания bx:=@X[1,1]25NMoldcxDataXSumequ20equ30equdisegmentdwN*M dup (?)dw0.

. .Data ends. . .; Здесь ввод матрицы Xmovbx,offset X; Адрес X[1,1]movcx,NL1:cmpword ptr [bx],0jgeL3movoldcx,cxmovcx,ML2:movax,[bx]addSum,axaddbx,2loop L2movcx,oldcxjmpL4L3:addbx,2*M; На след. строкуL4:loop L1Приведённый пример очень хорошо иллюстрирует стиль мышления программиста на Ассемблере. Для доступа к элементам обрабатываемых данных применяются указатели (ссылочные переменные, значениями которых являются адреса), и используются операции над этими адресами (так называемая адресная арифметика). Получающиеся программы могут максимально эффективно учитывать все особенности архитектуры используемого компьютера.

Заметим, что применение адресови адресной арифметики свойственно и некоторым языкам высокого уровня (например, языку С), который ориентирован на использование особенности машинной архитектуры для написания болееэффективных программ.Вернёмся теперь к описанию команд цикла. В языке Ассемблера есть и другие команды цикла,которые могут производить досрочный (до исчерпания счётчика цикла) выход из цикла с параметром. Как и для команд условного перехода, для мнемонических имен некоторых из них существуютсинонимы, которые мы будем разделять в описании этих команд символом / (слэш).Командаloopz/loope Lвыполняется по схемеDec(CX); if (CX<>0) and (ZF=1) then goto L;А командаloopnz/loopne Lвыполняется по схемеDec(CX); if (CX<>0) and (ZF=0) then goto L;В этих командах необходимо учитывать, что операция Dec(CX) является частью команды цикла и не меняет флага ZF.

Как видим, досрочный выход из таких циклов может произойти при соответствующих значениях флага нуля ZF. Такие команды используются в основном при работе с массивами, для усвоения этого материала Вам необходимо изучить соответствующий раздел учебникапо Ассемблеру.Вопросы и упражнения1.2.3.Когда у программиста может появиться необходимость при написании своих программ использовать не более удобный для программирования язык высокого уровня, а перейти на языкнизкого уровня (Ассемблер)?Можно ли выполнять команды из сегмента данных?Для чего нужна команда (смены) префикса сегмента?264.5.6.7.8.9.10.11.12.13.14.15.В каких сегментах могут располагаться области данных для хранения переменных?Почему реализованы две макрокоманды для вывода знаковых (outint) и беззнаковых (outword) чисел, в то время, как макрокоманда ввода целого числа всего одна (inint)?Почему сегментные регистры CS и SS не могут быть загружены самим программистом в начале работы его программы?Почему в языке машины не реализована команда пересылки вида mov CS,op2 ?Почему для команд условного перехода оставлен только один формат близкого относительного короткого перехода?Для чего необходимы разные команды условного перехода после сравнения на больше илименьше знаковых и беззнаковых чисел?Что делать, если в команде условного перехода необходимо передать управление на метку,расположенную достаточно далеко от точки перехода?Чем отличается выполнение команды inc op1 от выполнения команды add op1,1 ?Почему для деления числа в формате слова на маленькие числа необходимо использовать команду длинного, а не короткого деления?Почему при реализации цикла на Ассемблере, если это возможно, надо выбирать цикл с постусловием, а не цикл с предусловием?Когда перед операндом формата i16 необходимо ставить явное задание длины операнда в виде word ptr ?Как работает оператор Ассемблера type ?277.8.

Работа со стекомПрежде, чем двигаться дальше в описании команд перехода, нам необходимо изучить понятиеаппаратного стека и рассмотреть команды машины для работы с этим стеком.Стеком в архитектуре нашего компьютера называется сегмент памяти, на начало которого указывает сегментный регистр SS (таким образом, стек в машине есть всегда). При работе программы врегистр SS можно последовательно загружать адреса начал разных сегментов, поэтому иногда говорят, что в программе несколько стеков. Однако в каждый момент стек только один – тот, на которыйсейчас указывает регистр SS. Именно его мы и будем далее иметь в виду.В нашей архитектуре стек хранится в сегменте памяти в перевёрнутом виде: начало сегмента (сменьшими адресами) является концом стека, а конец сегмента (с бóльшими адресами) – началом стека.

Кроме начала и конца, у стека есть текущая позиция – вершина стека, её смещение от началасегмента стека всегда записано в регистре SP (Stack Pointer). Следовательно, как мы уже знаем,физический адрес вершины стека можно получить по формуле Афиз = (SS*16 + SP)mod 220.Стек есть аппаратная реализация абстрактной структуры данных стек. В этой реализации ввершину стека можно записывать (и, соответственно, читать из неё) только машинные слова, команды чтение и запись в стек байтов в архитектуре рассматриваемого нами компьютера не предусмотрены. Это, конечно, не значит, что в стеке нельзя хранить байты, двойные слова и т.д., просто нетмашинных команд для записи в вершину стека и чтения из вершины стека данных этих форматов.Наличие стека не отменяет для нашего компьютера принципа Фон Неймана однородности памяти,поскольку одновременно стек является и просто сегментом оперативной памяти и, таким образом,возможен обмен данными с этой памятью с помощью обычных команд (например, команд пересылки mov).В соответствие с определением машинного стека последнее записанное в него слово будет храниться в вершине стека, и читаться из стека первым.

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

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

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

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