Главная » Просмотр файлов » Попов И.И., Матвеев А.А., Максимов Н.В. Архитектура электронно-вычислительных машин и систем (2004)

Попов И.И., Матвеев А.А., Максимов Н.В. Архитектура электронно-вычислительных машин и систем (2004) (1186255), страница 94

Файл №1186255 Попов И.И., Матвеев А.А., Максимов Н.В. Архитектура электронно-вычислительных машин и систем (2004) (Попов И.И., Матвеев А.А., Максимов Н.В. Архитектура электронно-вычислительных машин и систем (2004)) 94 страницаПопов И.И., Матвеев А.А., Максимов Н.В. Архитектура электронно-вычислительных машин и систем (2004) (1186255) страница 942020-08-27СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

адреса трех последних видовиспользуются для доступа к ячейкам стека.3) В строковых командах STOS, MOVS, SCAS и CMPS, имеющихдва операнда-адреса, на которые указывают индексные регистры SI и DI,один из операндов (на который указывает SI) сегментируется порегистру DS, а другой (на него указывает DI) - по регистру ES.480Программные сегменты. Директива ASSUMEРассмотрим, как сегментирование проявляется в программах наMASM. Для того чтобы указать, что некоторая группа предложенийпрограммы на MASM образуют единый сегмент памяти,ониоформляются как программный сегмент: перед ними ставится директиваSEGMENT, после них - директива ENDS, причем в начале обеих этихдиректив должно быть указано одно и то же имя, играющее роль именисегмента.Программажевцелом представляет собойпоследовательность таких программных сегментов, в конце которойуказывается директива конца программы END, например:DT1 SEGMENT;программный сегмент с именем DT1A DB 0B DW ?DT1 ENDS;DT2 SEGMENT;программный сегмент DT2C DB 'hello'DT2 ENDS;CODE SEGMENT;программный сегмент CODEASSUME CS:CODE, DS:DT1, ES:DT2BEG: MOV AX,DT2MOV DS,AXMOV BH,C...CODE ENDSEND BEG ;конец текста программыПредложения программного сегмента ассемблер размещает водном сегменте памяти (в совокупности они не должны занимать более64Кб) начиная с ближайшего свободного адреса, кратного 16.

Номер(первые 16 битов начального адреса) этого сегмента становитсязначением имени сегмента. В MASM это имя относится к константнымвыражениям, а не адресным, в связи с чем в командеMOV AX,DT2второй операнд является непосредственным, поэтому в регистрAX будет записано начало (номер) сегмента DT2, а не содержимоеначальной ячейки этого сегмента.Имена же переменных (A, B, C) и метки (BEG) относятся кадресным выражениям, и им ставится в соответствие адрес их ячейкиотносительно "своего" сегмента:имени A соответствует адрес 0,имени B - адрес 1,имени C - адрес 0, а метке BEG - адрес 0.481Все ссылки на предложения одного программного сегментаассемблер сегментирует по умолчанию по одному и тому жесегментному регистру. По какому именно - устанавливаетсяспециальной директивой ASSUME.

В нашем примере эта директиваопределяет, что все ссылки на сегмент CODE должны, если явно неуказан сегментный регистр, сегментироваться по регистру CS, всессылки на DT1 - по регистру DS, а все ссылки на DT2 - по регистру ES.Встретив в тексте программы ссылку на какое-либо имя(например, на имя C в команде MOV AX,C), ассемблер определяет, вкаком программном сегменте оно описано (у нас - в DT2), затем поинформации из директивы ASSUME узнает, какой сегментный регистрпоставлен в соответствие этому сегменту (у нас - это ES), и далееобразует адресную пару из данного регистра и смещения имени (у нас ES:0), которую и записывает в формируемую машинную команду.

Приэтом ассемблер учитывает используемое в I80Х86 соглашение осегментных регистрах по умолчанию: если в адресной паре,построенной им самим или явно заданной в программе, сегментныйрегистр совпадает с регистром по умолчанию, то в машинную командузаносится лишь смещение. Если, скажем, в нашем примере встретитсякомандаMOV CX,B,тогда по имени В ассемблер построит пару DS:1, но раз операнд-адрескоманды MOV по умолчанию сегментируется по регистру DS, тозаписывать этот регистр в машинную команду излишне и ассемблерзаписывает в нее только смещение 1.Таким образом, директива ASSUME избавляет программистов отнеобходимости выписывать полные адресные пары не только тогда,когда используются сегментные регистры по умолчанию (как в случае сименем B), но тогда, когда в машинной команде нужно было бы явноуказать сегментный регистр (как в случае с именем C).

В MASMсегментный регистр в ссылке на имя требуется указывать лишь тогда,когда имя должно по каким-либо причинам сегментироваться порегистру, отличному от того, что поставлен в соответствие всемусегменту, в котором это имя описано.Однако все это справедливо только при соблюдении следующихусловий.Во-первых, директива ASSUME должна быть указана передпервой командой программы.В противном случае ассемблер,просматривающий текст программы сверху вниз, не будет знать, каксегментировать имена из команд, расположенных до этой директивы, ипотому зафиксирует ошибку.Во-вторых, в директиве ASSUME следует каждому сегментуставить в соответствие сегментный регистр: если ассемблеру встретитсяссылка на имя из сегмента, которому не соответствует никакойсегментный регистр, то он зафиксирует ошибку.

Правда, в обоих482случаях можно избежать ошибки, но для этого в ссылках необходимоявно указывать сегментный регистр.Начальная загрузка сегментных регистровДиректива ASSUME сообщает ассемблеру о том, по какимрегистрам он должен сегментировать имена из каких сегментов, и"обещает", что в этих регистрах будут находиться начальные адресаэтих сегментов. Однако загрузку этих адресов в регистры самадиректива не осуществляет.Сделать такую загрузку - обязанность самой программы, сзагрузки сегментных регистров и должно начинаться выполнениепрограммы.

Делается это так.Поскольку в I80Х86 нет команды пересылки непосредственногооперанда в сегментный регистр (а имя, т.е. начало, сегмента - этонепосредственный операнд), то такую загрузку приходится делать черезкакой-то другой, несегментный, регистр (например, AX):MOV AX,DT1 ;AX:=начало сегмента DT1MOV DS,AX ;DS:=AXАналогично загружается и регистр ES.Загружать регистр CS в начале программы не надо: он, как исчетчик команд IP, загружается операционной системой перед тем, какначинается выполнение программы (иначе нельзя было бы начать еевыполнение). Что же касается регистра SS, используемого для работысо стеком, то он может быть загружен так же, как и регистры DS и ES,однако в MASM предусмотрена возможность загрузки этого регистраеще до выполнения программыСсылки впередВстречая в символьной команде ссылку назад - имя, котороеописано в тексте программы до этой команды, ассемблер уже имеетнеобходимую информацию об имени и потому может правильнооттранслировать эту команду.

Но если в команде встретится ссылкавперед, т.е. имя, которое не было описано до команды и которое,наверное, будет описано позже, то ассемблер в большинстве случаев несможет правильно оттранслировать эту команду. Например, не зная, вкаком программном сегменте будет описано это имя, ассемблер неможет определить, по какому сегментному регистру надосегментировать имя, и потому не может определить, надо или нетразмещать перед соответствующей машинной командойпрефиксзамены сегмента и, если надо, то какой именно.В подобной ситуации ассемблер действует следующим образом:483— если в команде встретилась ссылка вперед, то он делает некотороепредположение относительно этого имени и уже на основе этогопредположения формирует машинную команду.— если затем (когда встретится описание имени) окажется, что данноепредположение было неверным, тогда ассемблер пытается исправитьсформированную ранее машинную команду. Однако это не всегдаудается: если правильная машинная команда должна заниматьбольше места, чем машинная команда, построенная на основепредположения (например, перед командой надо на самом делевставить префикс замены сегмента), тогда ассемблер фиксируетошибку (как правило, это ошибка номер 6: Phase error betweenpasses.)Какие же предположения делает ассемблер, встречая ссылкувперед?Во всех командах, кроме команд перехода, ассемблерпредполагает, что имя будет описано в сегменте данных и потомусегментируется по регистру DS.

Это следует учитывать при составлениипрограммы: если в команде встречается ссылка вперед на имя, котороеописано в сегменте, на начало которого указывает сегментный регистр,отличный от DS, то перед таким именем автор программы долженнаписать соответствующий префикс. Пример:CODE SEGMENTASSUME CS:CODEX DW ?BEG: MOV AX,X ;здесь вместо CS:X можно записать просто XMOV CS:Y,AX ;здесь обязательно надо записать CS:Y...Y DW ?СODE ENDSПереходыВ систему команд I80Х86 входит обычный для ЭВМ набор командперехода: безусловные и условные переходы, переходы с возвратами идр.

Однако в I80Х86 эти команды имеют некоторые особенности,которые здесь и рассматриваются.Абсолютный адрес команды, которая должна быть выполненаследующей, определяется парой CS:IP, поэтому выполнение переходаозначает изменение этих регистров, обоих или только одного (IP).— если изменяется только счетчик команд IP, то такой переходназывается внутрисегментным или близким (управление остается втом же сегменте команд),484— если меняются оба регистра CS и IP, то это межсегментный илидальний переход (начинают выполняться команды из другогосегмента команд).По способу изменения счетчика команд переходы делятся наабсолютные и относительные.— если в команде перехода указан адрес (смещение) той команды,которой надо передать управление, то это абсолютный переход.— если в команде указана величина (сдвиг), которую надо добавить ктекущему значению регистра IP, чтобы получился адрес перехода, итогда это будет относительный переход; при этом сдвиг может бытьположительным и отрицательным, так что возможен переход впереди назад.По величине сдвига относительные переходы делятся на короткие(сдвиг задается байтом) и длинные (сдвиг - слово).Абсолютные же переходы делятся на прямые и косвенные:— при прямом переходе адрес перехода задается в самой команде,— при косвенном - в команде указывается регистр или ячейка памяти, вкотором (которой) находится адрес перехода.Безусловные переходыВ MASM все команды безусловного перехода обозначаютсяодинаково:JMP opно в зависимости от типа операнда, ассемблер формирует разныемашинные команды.1) Внутрисегментный относительный короткий переход.JMP i8(IP:=IP+i8)Здесь i8 обозначает непосредственный операнд размеров в байт,который интерпретируется как знаковое целое от -128 до 127.

Командаприбавляет это число к текущему значению регистра IP, получая в немадрес (смещение) той команды, которая должна быть выполненаследующей. Регистр CS при этом не меняется.Необходимо учитывать следующую особенность регистра IP.Выполнение любой команды начинается с того, что в IP заносится адресследующей за ней команды, и только затем выполняется собственнокоманда. Для команды относительного перехода это означает, чтооперанд i8 прибавляется не к адресу этой команды, а к адресу команды,следующей за ней, поэтому, к примеру, команда JMP 0 - это переход наследующую команду программы.При написании машинной программы сдвиги для относительныхпереходов приходится вычислять вручную, однако MASM избавляет отэтого неприятного занятия: в MASM в командах относительного485перехода всегда указывается метка той команды, на которую надопередать управление, и ассемблер сам вычисляет сдвиг, который он изаписывает в машинную команду.

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

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

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