Максимов Н.В., Партыка Т.Л., Попов И.И. Архитектура ЭВМ и вычислительных систем (2005) (1186253), страница 73
Текст из файла (страница 73)
ниже) производится с использованием ассемблерныхпредставлений. Поэтому два слова скажем о программировании наассемблере 8086 (MASM).Формат команд ассемблера. Текст исходной программы состоитиз операторов ассемблера, каждый из которых занимает отдельнуюстроку этого текста. Различают два типа операторов: инструкции идирективы. Первые при трансляции преобразуются в команды процессора, которые исполняются после загрузки в память загрузочного модуля программы, имеющего расширение .com или .ехе. Операторы второго типа управляют процессом ассемблирования — преобразования текста исходной программы в коды объектного модуля(расширение .obj).
Ассемблер интерпретирует и обрабатывает операторы один за другим, генерируя последовательность из командпроцессора и байтов данных.Общий формат оператора ассемблера имеет следующий вид:[Метка:]Код_операции[Операнд![,Операнд2]][;Комментарий],где элементы, указанные в квадратных скобках, могут отсутствовать.Пробелы вводятся произвольно, но минимум один пробел должен быть после кода операции.Метка — это идентификатор, присваиваемый первому байтутого оператора, в котором она появляется.Код_ операции — это мнемоническое обозначение соответствующих команд процессора.Операнды оператора ассемблера описываются выражениями.Выражения конструируются на основе операций над числовыми и4.3. Режимы процессора. Система команд процессоров 180x86...373текстовыми константами, метками и идентификаторами переменных с использованием знаков операций и некоторых зарезервированных слов.Ниже приведены все определенные в ассемблере операции.Порядок старшинства операций от высшей к низшей:LENGTH, SIZE, WIDTH, MASK, (), [].PTR, OFFSET, SEG, TYPE, THISОHIGH, LOW+ (унарная) , - (унарная)*, /, MOD, SHL, SHREQ,NE,LT,LE,GT,GENOTANDOR, XORSHORT,.TYPEСтаршинство операций определяет порядок, по которому будетвычисляться выражение.
Более старшие операции будут производиться раньше операций, имеющих меньшее старшинство.ПримечанияОперации, стоящие в одной строке, имеют равный приоритет. Операцииравного старшинства вычисляются слева направо.Операции, стоящие в скобках, выполняются первыми.Пример оператора ассемблера:10c_l: mov ax, (DAT_l+4) SHR 4 .Здесь использованы следующие операции ассемблера: ( ) , +И SHR.Вот примеры некоторых арифметических операторов:«+» Сложение(бинарное) или унарный плюсexpression! + expression2 (сложение)ИЛИ+ expression (унарный плюс)Бинарный «+» суммирует значения двух выражений, унарный —сохраняет знак и значение выражения.374Глава 4.
Персональные компьютерыПримечанияОператор сложения («+») может использоваться для прибавления целогочисла к операнду, перемещаемому в памяти. Операндом, перемешаемым в памяти, может быть только одно из выражений Оба выражения могут быть целымичисламиУнарная операция «+» обладает более высоким приоритетом, чем операторсложения«-» Вычитание (бинарное) или унарный минусexpression! - expression2(вычитание)ИЛИ- expression (унарный минус) .Бинарный «-» вычитает одно выражение из другого, унарный —изменяет знак выражения.Примечания.Операндами оператора вычитания могут быть целые числа или операнды,перемещаемые в памяти.
Если оба операнда являются адресами памяти, то онидолжны располагаться в одном и том же сегменте.Унарная операция «-» обладает более высоким приоритетом, чем операторвычитания.«*» Умножениеexpression! * expression2.Перемножает значения двух выражений.Примечания.Выражения должны быть целыми числами, и они не могут быть адресами,перемещаемыми в памяти.«/» Делениеexpressionl / expression2Делит одно выражение на другое.Примечания.Выражения должны быть целыми числами, они не могут быть адресами, перемещаемыми в памяти.«MOD» Деление по модулювыражение! MOD вьгражение2Выдает остаток от деления.4.3. Режимы процессора.
Система команд процессоров 180x86...375Примечания.Оба выражения должны быть целыми числами, они не должны быть настраиваемыми адресами.Например, 14 MOD 4 = 2, так как 14/4 дает остаток 2Оперативная память. Объем оперативной памяти 180X86 (здесь —8086) — 220 байт (1 Мбайт). Байты нумеруются, начиная с 0, номербайта называется его адресом. Для ссылок на байты памяти используются 20-разрядные адреса: от 0 0 0 0 0 до FFFFF (в шестнадцатеричной системе).Байт содержит 8 разрядов (битов), каждый из которых можетпринимать значение 1 или 0.
Разряды нумеруются справа налево отО до 7:16543210Байт — наименьшая адресуемая ячейка памяти. В 180X86 используются и более крупные ячейки — слова и двойные слова. Слово — это два соседних байта, размер слова — 16 бит (они нумеруются справа налево от 0 до 15). Адресом слова считается адрес его первого байта (с меньшим адресом); этот адрес может быть четным инечетным.
Двойное слово — это любые четыре соседних байта (двасоседних слова), размер такой ячейки — 32 бита; адресом двойногослова считается адрес его первого байта.Байты используются для хранения небольших целых чисел исимволов, слова — для хранения целых чисел и адресов, двойныеслова — для хранения «длинных» целых чисел и так называемых адресных пар (сегмент:смещение).Регистры.
Помимо ячеек оперативной памяти для хранения данных (правда, кратковременного) можно использовать и регистры —ячейки, входящие в состав процессора и доступные из машиннойпрограммы. Доступ к регистрам осуществляется значительно быстрее, чем к ячейкам памяти, поэтому использование регистров заметно уменьшает время выполнения программ.Все регистры имеют размер слова (16 битов), за каждым из нихзакреплено определенное имя (АХ, SP и т.
п.). По назначению испособу использования регистры можно разбить на следующиегруппы:• регистры общего назначения (АХ, вх, ex, DX, ВР, si, DI, SP);• сегментные регистры (cs, DS, ss, ES);• счетчик команд (IP);• регистр флагов (Flags).376Глава 4. Персональные компьютерыРасшифровка этих названий:РегистрАббревиатураПереводАaccumulatorВbaseБазаСcounterСчетчикDdataДанныеВРbase pointerУказатель базыS!source indexИндекс источникаАккумулятор01destination indexИндекс приемникаSPstack pointerУказатель стекаCScode segmentСегмент командDSdata segmentСегмент данныхSSstack segmentСегмент стекаESextra segmentДополнительный сегментIPinstruction pointerСчетчик командРегистры общего назначения можно использовать во всех арифметических и логических командах.
В то же время каждый их нихимеет определенную специализацию (некоторые команды «работают» только с определенными регистрами). Например, команды умножения и деления требуют, чтобы один из операндов находился врегистре АХ или в регистрах АХ и DX (в зависимости от размера операнда), а команды управления циклом используют регистр сх в качестве счетчика цикла. Регистры вх и ВР очень часто используются какбазовые регистры, a si и DI — как индексные. Регистр SP обычноуказывает на вершину стека, аппаратно поддерживаемого в 180X86.Регистры АХ, вх, сх и DX конструктивно устроены так, что возможен независимый доступ к их старшей и младшей половинам;можно сказать, что каждый из этих регистров состоит из двух байтовых регистров, обозначаемых АН, AL, вн и т.
д. (н — high, старший; L — low, младший):РегистрАббревиатураСтарший полурегистрМладший полурегистрАккумуляторАХАНALБазаВХВНBLСчетчикСХСНCLДанныеDXDHDL15-015-87-0Разряды4.3. Режимы процессора. Система команд процессоров 180x86...377Таким образом, с каждым из этих регистров можно работать какс единым целым, а можно работать и с его «половинками». Например, можно записать слово в АХ, а затем считать только часть словаиз регистра АН или заменить только часть в регистре AL и т.
д. Такоеустройство регистров позволяет использовать их для работы как счислами, так и с символами.Все остальные регистры не делятся на «половинки», поэтомусчитать или записать их содержимое (16 битов) можно только целиком.Сегментные регистры CS, DS, SS и ES не могут быть операндаминикаких команд, кроме команд пересылки и стековых команд. Этирегистры используются только для сегментирования адресов.Счетчик команд IP всегда содержит адрес (смешение от началапрограммы) той команды, которая должна быть выполнена следующей (начало программы хранится в регистре CS).
Содержимое регистра I р можно изменить только командами перехода.Флаги. Имеется особый регистр флагов. Флаг — это бит, принимающий значение «1» (флаг установлен), если выполнено некотороеусловие, или «О» (флаг сброшен) в противном случае (табл. 4.3).В 180X86 используется 9 флагов, каждому из них присвоено определенное имя (ZF, CF и т. д.). Все они собраны в регистре флагов (каждый флаг — это один из разрядов регистра, часть его разрядов неиспользуется):Регистр флаговФлагиXх|XXOFDFIFTFSFZFXAFXPFXCFРазряды1514131211109876543210Некоторые флаги являются флагами условий; они автоматически меняются при выполнении команд и фиксируют те или иныесвойства их результата (например, равен ли он нулю).Другие флаги называются флагами состояний; они меняются изпрограммы и оказывают влияние на дальнейшее поведение процессора (например, блокируют прерывания).Представление чисел.
Здесь рассматривается машинное представление целых чисел, строк и адресов. Представление двоично-десятичных чисел, используемых достаточно редко, не рассматривается. Что касается вещественных чисел, то в 180X86 нет команд вещественной арифметики (операции над этими числами реализуютсяпрограммным путем или выполняются сопроцессором) и потому378Глава 4. Персональные компьютерыТаблица 4 3 Содержание регистра флаговФлаги условийCFcarry flagПринимает значение 1, если при сложении целых чиселпоявилась единица переноса, не укладывающаяся в разрядную сетку, или если при вычитании чисел без знака первоеиз них было меньше второго В командах сдвига в CF заносится бит, вышедший за разрядную сетку CF фиксируеттакже особенности команды умноженияФлаг переносаУстанавливается в 1 , если при сложении или вычитании целых чисел со знаком получился результат, по модулю преФлаг переполнениявосходящий допустимую величину (произошло переполнение мантиссы и она «залезла» в знаковый разряд)OFoverflow flagZFzero flagФлаг нуляУстанавливается в 1 , если результат команды оказался равным 0SFsign flagФлаг знакаУстанавливается в 1 , если в операции над числами со знаками получился отрицательный результатPFparity flagФлаг четностиРавен 1 , если результат очередной команды содержит четное количество двоичных единиц Учитывается обычнотолько при операциях ввода-выводаAF auxiliary carry flagФлаг дополнитель- Фиксирует особенности выполнения операций над двоичного переносано десятичными числамиФлаги состоянийDFdirection flagУстанавливает направление просмотра строк в строковыхФлаг направления командах при DF = 0 строки просматриваются «вперед» (отначала к концу), при DF = 1 - в обратном направленииIFinterrupt (lagФлаг прерыванийTFtrap flagПри IF = 0 процессор перестает реагировать на поступающие к нему прерывания, при IF = 1 блокировка прерыванийснимаетсяПри TF = 1 после выполнения каждой команды процессорФлаг трассировки делает прерывание (с номером 1), чем можно воспользоваться при отладке программы для ее трассировкинет стандартного представления вещественных чисел.