BAULA1 (Лекции Баулы)

2019-04-28СтудИзба

Описание файла

Файл "BAULA1" внутри архива находится в папке "Лекции Баулы". Документ из архива "Лекции Баулы", который расположен в категории "". Всё это находится в предмете "архитектура эвм" из 2 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .

Онлайн просмотр документа "BAULA1"

Текст из документа "BAULA1"

92


Сделаем теперь важные замечания к нашей программе. Во-первых, мы не проверяли, что команды сложения и вычитания дают правильный результат (для этого, как мы знаем, после выполнения этих команд нам было бы необходимо проверить флаг переполнения OF, т.к. наши числа мы считаем знаковыми). Во-вторых, команда длинного умножения располагает свой результат в двух регистрах (dx,ax), а в нашей программе мы брали результат произведения только из регистра ax, предполагая, что на регистре dx находятся только незначащие цифры произведения. По-хорошему надо было бы проверить, что в dx содержаться только нулевые биты, если ax  0, и только двоичные “1”, если

ax < 0. Другими словами, знак числа в регистре dx должен совпадать со знаком числа в регистре ax, для знаковых чисел это и есть признак того, что в регистре dx содержится незначащая часть произведения. И, наконец, мы не проверили, что не производим деления на ноль (в нашем случае что A<>8). В наших учебных программах мы иногда не будем делать таких проверок, но в “настоящих” программах, которые Вы будете создавать на компьютерах и предъявлять преподавателям, эти проверки являются обязательными.

Продолжая знакомство с языком Ассемблера, решим следующую задачу. Напишем фрагмент программы, в котором увеличивается на единицу целое число, расположенное в 23456710 байте оперативной памяти. Мы уже знаем, что запись в любой байт памяти возможна только тогда, когда этот байт расположен в одном из четырёх текущих сегментах. Сделаем, например, так, чтобы наш байт располагался в сегменте данных. Главное здесь – не путать сегменты данных, которые мы описываем в программе на Ассемблере, с активными сегментами, на начала которых установлены сегментные регистры. Описываемые в программе сегменты обычно размещаются загрузчиком на свободных участках оперативной памяти, и, как правило, при написании текста программы неизвестно их будущего месторасположение.1 Однако ничто не мешает нам любой участок оперативной памяти сделать сегментом, установив на него какой-либо сегментный регистр. Так мы и сделаем для решения нашей задачи, установив сегментный регистр DS на начало ближайшего сегмента, в котором будет находиться наш байт с адресом 23456710. Так как в сегментный регистр загружается адрес начала сегмента, делённый на 16, то нужное нам значение сегментного регистра можно вычислить по формуле: DS := 234567 div 16 = 14660. При этом адрес A нашего байта в сегменте (его смещение от начала сегмента) вычисляется по формуле: A := 234567 mod 16 = 7. Таким образом, для решения нашей задачи можно предложить следующий фрагмент программы:

mov ax,14660

mov ds,ax; Начало сегмента

mov bx,7; Смещение

inc byte ptr [bx]

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

7.5. Переходы

В большинстве современных компьютеров реализован принцип последовательного выполнения команд. Это значит, что после выполнения текущей команды счётчик адреса будет указывать на следующую (ближайшую с большим адресом) команду в оперативной памяти.2 Изменить последовательное выполнение команд можно с помощью переходов, при этом следующая команда может быть расположена в другом месте оперативной памяти. Ясно, что без переходов компьютеры функционировать не могут: скорость центрального процессора так велика, что он очень быстро может по одному разу выполнить все команда в оперативной памяти.

Понимание переходов очень важно при изучении архитектуры ЭВМ, они позволяют уяснить логику работы центрального процессора. Все переходы можно разделить на два вида.

  • Переходы, вызванные выполнением центральным процессором специальных команд переходов.

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

Начнём последовательное рассмотрение переходов для компьютеров нашей архитектуры. Напомним, что физический адрес начала следующей выполняемой команды зависит от значений двух регистров: сегментного регистра CS и счётчика адреса IP и вычисляется по формуле:

Aфиз := (CS*16 + IP)mod 220

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

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

IP := (IP + Const)mod 216

При абсолютном переходе происходит просто присваивание соответствующему регистру нового значения, например,

CS := Const

Опять же из соображений ценности практического использования в программировании, для сегментного регистра CS реализован только абсолютный переход, в то время как для счётчика адреса IP возможен как абсолютный, так и относительный переходы.

Далее будем классифицировать относительные переходы по величине той константы, которая прибавляется к значению счётчика адреса IP: при коротком переходе величина этой знаковой константы (напомним, что мы обозначаем её i8) не превышает по размеру одного байта (т.е. лежит в диапазоне от –128 до +127):

IP := (IP + i8)mod 216 ,

а при длинном переходе эта константа имеет размер слова (двух байт):

IP := (IP + i16)mod 216

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

IP := [m16]

Здесь на регистр IP заносится число, содержащееся в двух байтах памяти по адресу m16, т.е. это близкий длинный абсолютный косвенный переход.

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

7.6. Команды переходов

Изучим сначала команды переходов. Эти команды предназначены только для передачи управления в другое место программы, они не меняют никаких флагов.

7.6.1. Команды безусловного перехода

Рассмотрим сначала команды безусловного перехода, которые всегда передают управление в указанную в них точку программы. На языке Ассемблера все эти команды записываются в виде

jmp op1

Здесь op1 может иметь следующие форматы:

op1

Способ выполнения

Вид перехода

i8

IP := (IP + i8)mod 216

Близкий относительный короткий

i16

IP := (IP + i16)mod 216

Близкий относительный длинный

r16

IP := [r16]

Близкий абсолютный косвенный

m16

IP := [m16]

Близкий абсолютный косвенный

m32

IP := [m32], CS := [m32+2]

Дальний абсолютный косвенный

seg:off

IP := off, CS := seg

Дальний абсолютный прямой

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

Рассмотрим теперь, как на языке Ассемблера задаются эти операнды команд безусловного перехода. Для указания близкого относительного перехода в команде обычно записывается метка команды, на которую необходимо выполнить переход, например:

jmp L; Перейти на команду, помеченную меткой L

Напомним, что вслед за меткой команды, в отличие от метки области памяти, ставится двоеточие. Так как значением метки является её смещение в том сегменте, где эта метка описана, то программе Ассемблера приходится самой вычислять необходимое смещение i8 или i16, которое необходимо записать на место операнда в команде на машинном языке 1, например:

L: add bx,bx ; <─┐

. . . │

. . . │ i8 или i16 (со знаком !)

. . . │

jmp L; L = i8 или i16 <─┘

Здесь формат операнда (i8 или i16) выбирается программой Ассемблера автоматически, в зависимости от расстояния в программе между командой перехода и меткой. Если же метка L располагается в программе после команды перехода, то Ассемблер, ещё не зная истинного расстояния до этой метки, "на всякий случай" заменяет эту метку на операнд размера i16. Поэтому для тех программистов, которые знают, что смещение должно быть формата i8 и хотят сэкономить один байт памяти, Ассемблер предоставляет возможность задать размер операнда в явном виде:

jmp short L

Ясно, что это нужно делать только при острой нехватке оперативной памяти для программы. 2 Для явного указания дальнего перехода программист должен использовать оператор far ptr, например:

jmp far ptr L

Приведём фрагмент программы с различными видами командам безусловного перехода, в этом фрагменте описаны два кодовых сегмента (для иллюстрации дальних переходов) и один сегмент данных:

data segment

A1 dw L2; Смещение команды с меткой L2 в своём сегменте

A2 dd Code1:L1; Это seg:off

. . .

data ends

code1 segment

. . .

L1: mov ax,bx

. . .

code1 ends

code2 segment

assume cs:code2, ds:data

start:mov ax,data

mov ds,ax ; загрузка сегментного регистра DS

L2: jmp far ptr L1; дальний прямой абсолютный переход, op1=seg:off

. . .

jmp L1; ошибка т.к. без far ptr

jmp L2; близкий относительный переход, op1=i8 или i16

jmp A1; близкий абсолютный косвенный переход, op1=m16

jmp A2; дальний абсолютный косвенный переход, op1=m32

jmp bx; близкий абсолютный косвенный переход, op1=r16

jmp [bx]; ошибка, нет выбора: op1=m16 или m32 ?

mov bx,A2

jmp dword ptr [bx]; дальний абсолютный косвенный переход op1=m32

. . .

code2 ends

Отметим одно важное преимущество относительных переходов перед абсолютными. Значение i8 или i16 в команде относительного перехода зависит только от расстояния в байтах между командой перехода и точкой, в которую производится переход. При любом изменении в сегменте кода вне этого диапазона команд значения i8 или i16 не меняются.

Как видим, архитектура нашего компьютера обеспечивает большой спектр команд безусловного перехода. Напомним, что в нашей учебной машине УМ-3 была только одна команда безусловного перехода. На этом мы закончим наше краткое рассмотрение команд безусловного перехода. Напомним, что для усвоения материала по курсу Вам необходимо изучить соответствующий раздел учебника по Ассемблеру.

7.6.2. Команды условного перехода

Все команды условного перехода выполняются по схеме

if <условие перехода> then goto L

и производят близкий короткий относительный переход, если выполнено некоторое условие перехода, в противном случае продолжается последовательное выполнение команд программы. На Паскале условие перехода чаще всего задают в виде условного оператора

if op1 <отношение> op2 then goto L

где отношение – один из знаков операции отношения = (равно), <> (не равно), > (больше), < (меньше), <= (меньше или равно), >= (больше или равно). Если обозначить rez=op1–op2, то оператор условного перехода можно записать в эквивалентном виде сравнения с нулём

if rez <отношение> 0 then goto L

Все машинные команды условного перехода, кроме одной, вычисляют условие перехода, анализируя один, два или три флага из регистра флагов, и лишь одна команда условного перехода вычисляет условие перехода, анализируя значение регистра CX. Команда условного перехода в языке Ассемблер имеет вид

j<мнемоника перехода> i8; IP := (IP + i8)mod 216

Мнемоника перехода (это от одной до трёх букв) связана со значением анализируемых флагов (или регистра CX), либо со способом формирования этих флагов. Чаще всего программисты формируют флаги, проверяя отношение между двумя операндами op1 <отношение> op2, для чего выполняется команда вычитания или команда сравнения. Команда сравнения имеет мнемонический код операции cmp и такой же формат, как и команда вычитания:

cmp op1,op2

Она и выполняется точно так же, как команда вычитания за исключением того, что разность не записывается на место первого операнда. Таким образом, единственным результатом команды сравнения является формирование флагов, которые устанавливаются так же, как и при выполнении команды вычитания. Вспомним, что программист может трактовать результат вычитания (сравнения) как производимый над знаковыми или же беззнаковыми числами. Как мы уже знаем, от этой трактовки зависит и то, будет ли один операнд больше другого или же нет. Так, например, рассмотрим два коротких целых числа 0FFh и 01h. Как знаковые числа 0FFh = -1 < 01h = 1, а как беззнаковые числа 0FFh = 255 > 01h = 1.

Исходя из этого, принята следующая терминология: при сравнении знаковых целых чисел первый операнд может быть больше (greater) или меньше (less) второго операнда. При сравнении же беззнаковых чисел будем говорить, что первый операнд выше (above) или ниже (below) второго. Ясно, что действию "выполнить переход, если первый операнд больше второго" будут соответствовать разные машинные команды, если трактовать операнды как знаковые или же беззнаковые целые числа. Это учитывается в различных мнемониках этих команд.

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