Максимов Н.В., Партыка Т.Л., Попов И.И. Архитектура ЭВМ и вычислительных систем (2005) (1186253), страница 80
Текст из файла (страница 80)
Пусть надо переписать 10 000 байтов начиная с адреса Ав другое место памяти начиная с адреса в. Если оба этих имени относятся к сегменту данных, на начало которого указывает регистрDS, тогда эту пересылку можно сделать так:CLDMOVMOVMOVLEALEAREP;DF:=0 (просмотр строки вперед)СХ,1000 /СХ - число повторенийAX,DSES,AX ;ES:=DSSI,A ;ES:SI - «откуда»DI,B ;DS:DI - «куда»MOVSB /пересылка СХ байтов410Глава 4. Персональные компьютерыСтек. ПодпрограммыСтек. В 180X86 имеются специальные команды работы со стеком, т.
е. областью памяти, доступ к элементам которой осуществляется по принципу «последним записан — первым считан» (рис. 4.16).Но для того чтобы можно было воспользоваться этими командами,необходимо соблюдение ряда условий.Дно стекаFCF8"F4FOЕСЕ8"Е4Параметры*4—EBP = FFFFFFFO/Локальныепеременные•«— ESP=FFFFFFE4Рис. 4.16. Структура стековой памятиВо многих случаях программе требуется временно запомнитьинформацию, а затем считывать ее в обратном порядке.
Эта проблема в ПК решена посредством реализации стека LIFO («последним пришел — первым ушел»), называемого также стекомвключения/извлечения (stack — кипа, например бумаг). Наиболееважное использование стека связано с процедурами. Стек обычнорассчитан на косвенную адресацию через регистр SP — указательстека. При включении элементов в стек производится автоматическое уменьшение указателя стека, а при извлечении — увеличение, т. е. стек всегда «растет» в сторону меньших адресов памяти.Адрес последнего включенного в стек элемента называется вершиной стека (тоз).Под стек можно отвести область в любом месте памяти.
Размерее может быть любым, но не должен превосходить 64 Кб, а начальный адрес должен быть кратным 16. Другими словами, эта областьдолжна быть сегментом памяти (сегмент стека). Начало этого сегмента (первые 16 битов начального адреса) должно обязательно храниться в сегментном регистре SS.Хранимые в стеке элементы могут иметь любой размер, однакоследует учитывать, что в 180X86 имеются только команды записи в4.3. Режимы процессора. Система команд процессоров 180x86...411стек и чтения из него слов. Поэтому для записи байта в стек егонадо предварительно расширить до слова, а запись или чтение двойных слов осуществляются парой команд.В 180X86 принято заполнять стек снизу вверх, от больших адресов к меньшим: первый элемент записывается в конец области, отведенной под стек, второй элемент — в предыдущую ячейку областии т.
д. Считывается всегда элемент, записанный в стек последним.В связи с этим нижняя граница стека всегда фиксирована, а верхняя — меняется. Слово памяти, в котором находится элемент стека,записанный последним, является вершиной стека. Адрес вершины,отсчитанный от начала сегмента стека, должен находиться в указателе стека — регистре SP.
Таким образом, абсолютный адрес вершины стека определяется парой SS:SP.Значение «О» в регистре SP свидетельствует о том, что стекполностью заполнен (его вершина «дошла» до начала области стека). Поэтому для контроля за переполнением стека надо передновой записью в стек проверять условие SP = 0 (сам 180X86 этого не делает). Для пустого стека значение SP должно равнятьсяразмеру стека, т. е.
пара SS:SP должна указывать на байт, следующий за последним байтом области стека. Контроль за чтениемиз пустого стека, если это необходимо, должна делать сама программа.Начальная установка регистров SS и SP может быть произведенапрограммой, однако в MASM предусмотрена возможность автоматической загрузки этих регистров. Если в директиве SEGMENT, начинающей описание сегмента стека, указать параметр STACK, тогда ассемблер (точнее, загрузчик) перед тем, как передать управление напервую команду машинной программы, загрузит в регистры SS и SPнужные значения.
Например, если в программе сегмент стека описан следующим образом:ST SEGMENT STACKDB 256 DUP(?) /размер стека - 256 байтовST ENDSи если под этот сегмент была выделена область памяти начиная сабсолютного адреса 1234Oh, тогда к началу выполнения программыв регистре ss окажется величина I234h, а в регистре SP — величинаlOOh (=256).Отметим, что эти значения соответствуют пустому стеку.О с н о в н ы е с т е к о в ы е к о м а н д ы . При соблюдении указанных требований в программе можно использовать команды,412Глава 4. Персональные компьютерыпредназначенные для работы со стеком.
Основными из них являются следующие.1. Запись слова в стек:PUSHopЗдесь op обозначает любой 16-битовый регистр (в том числесегментный) или адрес слова памяти. По этой команде значение регистра SP уменьшается на 2 (вычитание происходит по модулю 2 16 ),после чего указанное операндом слово записывается в стек по адресу SS:SP.2. Чтение слова из стека:POP opСлово, считанное из вершины стека, присваивается операнду ор(регистру, в том числе сегментному, но не CS, или слову памяти),после чего значение SP увеличивается на 2.3. Переход с возвратом:CALLopЭта команда записывает адрес следующей за ней команды в стеки затем делает переход по адресу, определяемому операндом ор. Онаиспользуется для переходов на подпрограммы с запоминанием в стеке адреса возврата.
Имеются следующие разновидности этой команды (они аналогичны вариантам команды безусловного перехода JMP):• внутрисегментный относительный длинный переход (ор — непосредственный операнд размером в слово, а в MASM — этометка из текущего сегмента команд или имя близкой процедуры (см. ниже)); в этом случае в стек заносится только текущее значение счетчика команд IP, т.
е. смещение следующейкоманды;• внутрисегментный абсолютный косвенный переход (ор — адресслова памяти, в которой находится адрес (смещение) той команды, на которую и будет сделан переход); и здесь в стек записывается только смещение адреса возврата;• межсегментный абсолютный прямой переход (ор — непосредственный операнд вида s e g : o f s , а в MASM — это FAR PTR<метка> или имя дальней процедуры); здесь в стек заносятсятекущие значения регистров CS и IP (первым в стек записывается содержимое CS), т. е. абсолютный адрес возврата, послечего меняются регистры CS и IP;4.3. Режимы процессора.
Система команд процессоров 180x86...413• межсегментный абсолютный косвенный переход (ор — адресдвойного слова, в котором находится пара s e g : o f s , задающаяабсолютный адрес перехода), и здесь в стеке спасается содержимое регистров CS и IP.4. Переход (возврат) по адресу из стека:RET opИз стека считывается адрес и по нему производится переход.Если указан операнд (а это должно быть неотрицательное число), топосле чтения адреса стек еще очищается на это число байтов (к SPдобавляется это число).
Команда используется для возврата из подпрограммы по адресу, записанному в стек по команде CALL при вызове подпрограммы, и одновременной очистки стека от параметров,которые основная программа занесла в стек перед обращением кподпрограмме.Команда RET имеет две разновидности (хотя в MASM они одинаково записываются):• в первом случае из стека считывается только одно слово —смещение адреса возврата;• во втором — из стека считывается пара s e g r o f s , указывающая абсолютный адрес возврата.
Каким образом ассемблеропределяет, какой случай имеет место, объяснено ниже.В 180X86 стек в основном используется для организации подпрограмм и прерываний. Однако даже если программе не нуженстек, она все равно должна отвести под него место. Дело в том, чтостеком будет неявно пользоваться операционная система при обработке прерываний, которые возникают (например, при нажатииклавиш на клавиатуре) в то время, когда выполняется программа.Для нужд ОС рекомендуется выделять в стеке 64 байта.Прерывания. Иногда необходимо выполнить одну из набораспециальных процедур, если в системе или в программе возникаютопределенные условия, например, нажата клавиша на клавиатуре.Действие, стимулирующее выполнение одной из таких процедур,называется прерыванием, поскольку основной процесс при этомприостанавливается на время выполнения этой процедурыСуществует два общих класса прерываний: внутренние и внешние.