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

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

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

Программист, однако, может выбрать и другую последовательность кодирования ветвей, это не влияет на суть дела. Далее, мы предусмотрели выдачу аварийной диагностики, если результаты операций сложения (A+1), вычитания (A-1) или произведения(A+1)*(A-1) слишком велики и не помещаются в одно слово.Для увеличения и уменьшения операнда на единицу мы использовали командыinc op1 иdec op1Напомним, что, например, команда inc ax эквивалентна команде add ax,1 , но не меняетфлага CF. Таким образом, после этих команд нельзя проверить флаг переполнения, чтобы определить, правильно ли выполнились такие операции над беззнаковыми числами, это необходимо учитывать в надёжном программировании.

У нас, однако, числа знаковые, поэтому всё в порядке.Обратите также внимание, что мы использовали команду длинного деления, попытка использовать здесь короткое деление, напримерL2:mov bh,7; Третья ветвь вычисления Xidiv bh; ah:=(A+1) mod 7, al:=(A+1) div 7может часто приводить к ошибке. Здесь остаток от деления (A+1) на число 7 всегда поместится врегистр ah, однако частное (A+1) div 7 может не поместиться в регистр al (пусть, например, A=28000, тогда (A+1) div 7 = 4000 – не поместится в регистр al).Для выдачи аварийной диагностики мы использовали предложения АссемблераError:mov dx,offset DiagnoutstrВ первой команде применена специальная операция языка Ассемблера offset. Эта одноместная операция, будучи применена к некоторому имени, вычисляет адрес (т.е. смещение) этого имениот начала сегмента.

Можно сказать, что эта операция смены способа адресации:19mov ax,A; ax:=значение переменной A, это формат RX=r16,m16mov ax,offset A; ax:=адрес переменной A, это формат RI=r16,i16При использовании команд условного перехода мы предполагали, что расстояние от точки перехода до нужной метки небольшое (формата i8), если это не так, то программа Ассемблера выдастнам соответствующую диагностику об ошибке и нам придётся использовать "плохой стиль программирования", как объяснялось выше.

В нашей программе это может случиться только тогда, когдасуммарный размер кода программы между командой условного перехода и соответствующей меткой(включая код, подставляемый вместо макрокоманд outint и finish) будет больше 128 байт(обязательно понять это!).7.7.3. Команды циклаДля организации циклов на Ассемблере вполне можно использовать команды условного перехода. Например, цикл языка Паскаль с предусловием while X<0 do S для целой знаковой переменной X можно реализовать в виде следующего фрагмента на Ассемблере:L:cmp X,0; Сравнить X с нулёмjge L1; Здесь будет оператор Sjmp LL1: . .

.Аналогично, оператор цикла с постусловием repeat S1; S2; ... Sk until X<0 можнореализовать в виде такого фрагмента на Ассемблере:L:;S1;S2. . .;Skcmp X,0; Сравнить X с нулёмjge L. . .В этих примерах мы считаем, что тело цикла по длине не превышает примерно 120 байт (это30-40 машинных команд). Как видим, цикл с постусловием требует для своей реализации на однукоманду (и на одну метку) меньше, чем для цикла с предусловием.Как мы знаем, если число повторений выполнения тела цикла известно до начала исполненияэтого цикла, то в языке Паскаль наиболее естественно было использовать цикл с параметром.

Дляорганизации цикла с параметром в Ассемблере можно использовать специальные команды цикла.Команды цикла, по сути, тоже являются командами условного перехода и, как следствие, реализуюттолько близкий короткий относительный переход. Команда циклаloop L;Метка L заменится на операнд i8использует неявный операнд – регистр CX и её выполнение может быть так описано с использованием языка Паскаль:Dec(CX); {Это часть команды loop, поэтому флаги не меняются!}if CX<>0 then goto L;Как видим, регистр CX (который так и называется регистром-счётчиком цикла – loop counter),используется этой командой именно как параметр цикла. Лучше всего эта команда цикла подходитдля реализации цикла с параметром языка Паскаль видаfor CX:=N downto 1 do SЭтот оператор можно эффективно реализовать таким фрагментом на Ассемблере:mov CX,Njcxz L1L:. .

.; Тело цикла –. . .; оператор Sloop LL1: . . .Обратите внимание: так как цикл с параметром языка Паскаль по существу является циклом спредусловием, то до начала его выполнение проверяется исчерпание значений для параметра цикла с20помощью команды условного перехода jcxz L1 , которая именно для этого и была введена в языкмашины. Ещё раз напоминаем, что команды циклов не меняют флагов.Описанная выше команда цикла выполняет тело цикла ровно N раз, где N – беззнаковое число,занесённое в регистр-счётчик цикла CX перед началом цикла. Особым является случай, когда N=0, вэтом случае цикл выполнится 216 раз.

К сожалению, никакой другой регистр нельзя использоватькак счётчик для организации этого цикла (т.к. это неявный параметр команды цикла). Кроме того, вприведённом выше примере реализации цикла тело этого цикла не может быть слишком большим,иначе команда loop L не сможет передать управление на метку L.1В качестве примера использования команды цикла решим следующую задачу. Требуется ввестибеззнаковое число N<=500, затем ввести N знаковых целых чисел и вывести сумму тех из них, которые принадлежат диапазону –2000..5000.

На языке Турбо-Паскаль эта программа могла бы выглядеть следующим образом (мы заранее записываем её так, чтобы было легче перенести на Ассемблер):Const MaxN=500; S:integer=0;VarN: word; ax,cx: integer;BeginWrite('Введите N<=500 : '); Read(N);If N > MaxN then Writeln('Ошибка – большое N!') elseIf N > 0 then begin Write('Вводите целые числа');For cx:=N downto 1 do begin Read(ax);If (–2000<=ax) and (ax<=5000) then S:=S+axEndEnd;Writeln('S=',S)End.На Ассемблере можно предложить следующее решение этой задачи.include io.asm; файл с макроопределениями для макрокоманд ввода-выводаdata segmentMaxN equ500Ndw?Sdw0; Начальное значение суммы = 0T1db'Введите N<=500 $'T2db'Ошибка – большое N!$'T3db'Вводите целые числа',10,13,'$'T4db'Ошибка – большая сумма!$'data endsstack segment stackdw64 dup (?)stack endscode segmentassume cs:code,ds:data,ss:stackstart:movax,datamovds,axmovdx, offset T1; Приглашение к вводуoutstrinint N1В нашей архитектуре для эффективной реализации циклов применяются условные команды близкого перехода, как следствие тело цикла не может быть слишком большим (порядка 30-40 машинных команд), иначе,как уже говорилось, приходится пользоваться вспомогательными командами длинного безусловного перехода.Архитектурное решение о том, что циклы и условные переходы реализуются командами короткого перехода,опирается на так называемое свойство локальности программ.

Это свойство означает, что бóльшую часть времени центральный процессор выполняет команды, расположенные (локализованные) внутри относительно небольших участков программы (это и есть программные циклы), и достаточно редко переходит из одного такогоучастка в другой. Как мы узнаем позже, на свойстве локальности программ основано и существование в современных компьютерах специальной памяти типа кэш, а также так называемого расслоения оперативной памяти.21cmpN,MaxNjbeL1movdx,offset T2; Диагностика об ошибкеErr: outstrnewlinefinishL1:movcx,N; Счётчик циклаjcxz Pech; На печать результата при N=0movdx,offset T3; Приглашение к вводуoutstrL2:inint ax;Ввод очередного числаcmpax,-2000jlL3cmpax,5000jgL3;Проверка диапазонаaddS,ax; СуммированиеjnoL3;Проверка на переполнение Smovdx,offset T4jmpErrL3:loop L2Pech: outch 'S'outch '='outint Snewlinefinishcode endsend startКак видите, в отличие от Паскаля, наша программа на Ассемблере ещё и проверяет корректностьполученного результата.В качестве ещё одного примера рассмотрим использование циклов при обработке массивов.Пусть необходимо составить программу для решения следующей задачи.

Задана константаN=20000, надо ввести массивы X и Y по N беззнаковых чисел в каждом массиве и вычислить выражениеNS := ∑ X[i] * Y[N - i + 1]i =1Для простоты будем предполагать, что каждое из произведений и все частичные суммы всегдаимеют формат dw (т.е. помещаются в слово), иначе выдадим аварийную диагностику. Ниже приведена программа на Ассемблере, решающая эту задачу.include io.asmNequ20000; Аналог Const N=20000; Паскаляdata1 segmentT1db'Вводите числа массива $'T2db'Сумма = $'T3db'Ошибка – большое значение!',10,13,'$'Sdw0; искомая суммаXdwN dup (?); Массив X=2*N байтdata1 endsdata2 segmentYdwN dup (?); Массив Y=2*N байтdata2 endsstack segment stackdw64 dup(?)stack endscode segmentassume cs:code,ds:data1,es:date2,ss:stackbegin_of_my_program:movax,data122movds,ax;ds – на начало data1movax,data2moves,ax;es – на начало data2movdx,offset T1; Приглашение к вводуoutstroutch 'X'newlinemovcx,N; счётчик циклаmovbx,0; индекс массиваL1:inint X[bx];ввод очередного элемента X[i]addbx,2; увеличение индекса, это i:=i+1loop L1outstr; Приглашение к вводуoutch 'Y'newlinemovcx,N; счётчик циклаmovbx,0; индекс массиваL2:inint axmovY[bx],ax; ввод очередного элемента es:Y[bx]addbx,2; увеличение индексаloop L2movbx,offset X; указатель bx на X[1]movsi,offset Y+2*N-2; указатель si на Y[N]movcx,N; счётчик циклаL3:movax,[bx]; первый сомножительmulword ptr es:[si]; умножение на Y[N-i+1]jcErr; большое произведениеaddS,axjcErr; большая суммаaddbx,type X; это bx:=bx+2, т.е.

i:=i+1subsi,2; это i:=i-1loop L3; цикл суммированияmovdx,offset T2outstroutword SnewlinefinishErr: movdx,offset T3outstrfinishcode endsend begin_of_my_programПодробно прокомментируем эту программу. Количество элементов массивов мы задали, используя директиву эквивалентности N equ 20000 , это есть указание программе Ассемблера о том, чтовсюду далее в программе, где встретится имя N, надо подставить вместо него операнд этой директивы, т.е. в нашем случае число 20000. Таким образом, это почти полный аналог описания константыв языке Паскаль.1 Так как длина каждого элемента массива равна двум байтом, то под каждый измассивов соответствующая директива dw зарезервирует 2*N байт памяти.Заметим теперь, что оба массива не поместятся в один сегмент данных (в сегменте не болеепримерно 32000 слов, а у нас в сумме 40000 слов), поэтому массив X мы размещаем в сегменте сименем data1, а массив Y – в сегменте с именем data2.

Директива assume говорит, что во времясчёта на эти сегменты будут соответственно указывать регистры DS и ES, что мы и обеспечили, за1Если не принимать во внимание то, что константа в Паскале имеет тип, это позволяет контролировать еёиспользование в программе, а директива эквивалентности в Ассемблере – это просто указание о текстовойподстановке вместо имени заданного операнда директивы эквивалентности. Иногда перед такой подстановкой производится также некоторое вычисление операнда директивы эквивалентности, подробнее об этом необходимо прочитать в учебнике [5].23грузив эти регистры нужными значениями в самом начале программы. При вводе массивов мы использовали индексный регистр bx, в котором находится смещение текущего элемента массива отначала этого массива.При вводе массива Y мы для учебных целей вместо предложенияL2: inint Y[bx]; ввод очередного элементазаписали два предложенияL2: inint axmov Y[bx],ax; ввод очередного элементаЭто мы сделали, чтобы подчеркнуть пользу от директивы assume: при доступе к элементам массиваY программа Ассемблера учитывает то, что имя Y описано в сегменте data2 и автоматически(используя информацию из директивы assume) поставит перед командой mov Y[bx],ax специальную однобайтную команду es: .

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

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

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

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