учебники, программирование, основы, введение в,

 

Кодирование команд

 

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

использующих различные режимы адресации операндов.

Рассмотрим это на примере операции сложения. Так как в системе команд ЭВМ, базирующихся на микропроцессорах фирмы Intel,

результат операции записывается на место первого операнда, то данная операция будет иметь вид: a=a+b.

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

Общий формат ассемблерной команды имеет следующий вид:

[Метка:]  Мнемоника_операции  Операнд,Операнд [;  Комментарий]  

Метка - это идентификатор, присваиваемый адресу первого байта команды. Наличие метки в команде необязательно.

При отсутствии метки двоеточия быть не должно.

Во всех командах необходимо наличие мнемоники, обозначающей выполняемую команду.

Наличие и количество (один или два) операндов зависит от команды. В случае двух операндов они разделяются запятой,

при этом первым указывается операнд-приемник, а вторым - операнд-источник.

Примеры обозначения операндов при различных режимах адресации будут рассмотрены ниже.

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

При отсутствии комментария точка с запятой может не ставиться.

Кодирование линейных команд

Пример 1.

Оба операнда находятся в регистрах общего назначения: (AX)=a; (CX)=b.

Для обращения к операндам используется прямая регистровая адресация.

Символическая запись команды:

ADD AX,CX  

Согласно таблица 6.2 машинное представление этой команды имеет вид:

000000dw md reg r/m  

По условию операнды занимают полноразрядные регистры длиной 1 слово, следовательно, необходимо установить w=1.

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

Поэтому команда может иметь два различных представления в машинном коде.

При этом, если в поле reg закодирован номер регистра AX, то бит приемника результата d=1.

Если в поле reg закодирован номер регистра CX, то бит приемника результата d=0.

Здесь и далее в записи команд b означает двоичное представление, h - 16-е.

После выполнения команды в AX будет записана сумма содержимого регистров AX и CX,

а указатель команды IP увеличится на длину выполненной команды (2 байта) и будет указывать на первый байт следующей команды.

Здесь и далее представление информации будем давать в 16-м виде, если другое не оговорено особо.

Если перед началом выполнения команды (AX)=0C34, (CX)=1020, (IP)=0012, то после ее выполнения (AX)=1C54, (CX)=1020, (IP)=0014.

Пример 2.

Операнд a находится в регистре AX, b - непосредственный операнд, равный 56B3h.

Символическая запись команды:

ADD AX,56B3h  

Машинное представление:


Если непосредственный операнд имеет величину, которая может быть

закодирована в одном байте, например, 77 (в десятичной системе счисления), что при

представлении в дополнительном коде дает 0100 1101b = 4Dh, то за счет использования признака s удается сократить длину команды:


Данное представление команды построено по общей схеме команд суммирования

любого регистра с непосредственным операндом. Так как в нашем случае непосредственный

операнд суммируется с содержимым регистра AX, то команда может быть записана в специальном

формате работы с регистром- аккумулятором и иметь меньшую длину:


для операнда 56B3h.

Возможность использования признака s в этом формате отсутствует.

Пусть перед началом выполнения команды (AX)=03A4, (IP)=0012.

Тогда результатом выполнения команды ADD AX,56B3h будет: (AX)=5A57, (IP)=0016,

а результатом выполнения команды ADD AL,B3h будет: (AX)=0357, (IP)=0015,

если команда закодирована по общей схеме, и (IP)=0014 - если по схеме суммирования с аккумулятором.

Отметим, что в последнем случае действие выполняется лишь с младшим байтом регистра AX,

то есть с регистром AL, и его результат не влияет на содержимое AH.

Пример 3.

Операнд a находится в AX, операнд b - в оперативной памяти по прямому адресу 3474h.

Символическая запись команды:

ADD AX,[3474h]  

Ее машинное представление:


Пусть перед выполнением команды (AX)=1234, [3474h]=1A, [3475h]=25, (IP)=0012.

Напомним, что адрес слова в оперативной памяти - это адрес его младшего байта.

Тогда после выполнения команды: (AX)=374E, (IP)=0016.

Пример 4.

Если операнд a находится в оперативной памяти по прямому адресу 3474h, а операнд

b представляет собой непосредственный операнд, равный 56B3h, то символическая запись команды имеет вид:

ADD [3474h],56B3h  

а ее машинное представление:


При тех же исходных данных, что и в примере 3, результатом операции будет: [3474]=CD, [3475]=7B, (IP)=0018.

Пример 5.

Операнд a находится в слове оперативной памяти, адрес которого хранится в регистре BX,

а операнд b - в регистре AX. В этом случае адресация операнда a - регистровая косвенная.

Символическая запись команды:

ADD [BX],AX  

Машинное представление:


Если перед выполнением команды (AX)=1234, (BX)=3474, [3474]=D7, [3475]=11, (IP)=0012,

то в результате выполнения команды произойдут следующие изменения: [3474]=0B, [3475]=24, (IP)=0014.

Пример 6.

Операнд a находится в AX. Операнд b является элементом массива, первый элемент которого

помечен меткой MAS, а положение операнда b в массиве определяется содержимым регистра BX.

Символическая запись команды:

ADD AX,MAS[BX]  

При ассемблировании программы метке ставится в соответствие смещение относительно

начала сегмента. Таким образом, операнд b будет определяться в данном случае с помощью регистровой

относительной адресации (суммирование значения смещения и содержимого регистра).

Пусть начало массива MAS имеет смещение в 3000h байтов от начала сегмента DS. Тогда машинный

код команды будет иметь вид:


Если перед выполнением команды (AX)=1234, (BX)=0074, [3474]=E6, [3475]=64, (IP)=0102, то результатом

будет: (AX)=771A, (IP)=0106.

Если начало массива располагается со смещением 70h байтов от начала сегмента DS,

то программа Ассемблера сформирует более короткий машинный код команды:


Если исходное состояние элементов хранения совпадает с предыдущим, за исключением (BX)=3004,

то и результат будет таким же, за исключением (IP)=0105.

 

Пример 7.

Операнд a находится в регистре AL. Операнд b является элементом массива, начальный адрес которого

находится в регистре BX. Положение элемента в массиве определяется регистром DI .

В этом случае обращение к операнду b происходит посредством базово-индексной адресации.

 

Символическая запись команды имеет вид:

ADD AL,[BX+DI]  

Так как первый операнд находится в регистре AL, то он имеет длину 1 байт.

Поэтому в машинном представлении команды w=0, и она выглядит следующим образом:


Если до начала выполнения команды (AX)=25B7, (BX)=3000, (DI)=0474, [3474]=77, (IP)=2519,

то после ее выполнения произойдут следующие изменения: (AX)=252E, (IP)=251B.

Обратим внимание на то, что содержимое регистра AL представляет собой младший байт регистра AX.

Так как операция проводится над байтами,

то перенос в старший байт регистра AX блокируется.

Пример 8.

Операнд a находится в регистре AH. Операнд b является элементом двумерного массива, первый элемент

которого помечен меткой MAS.

Длина (в байтах) от начала массива до начала строки, в которой расположен операнд, хранится в регистре BX,

а в регистре DI хранится количество байт от начала текущей строки до операнда b

Символическая запись команды:

ADD AH,MAS[BX+DI]  

Машинный код команды будет зависеть от того, как далеко относительно начала сегмента

располагается начало массива (см. пример 6). Если это смещение занимает 2 байта и, например, равно 1D25,

то машинный код команды имеет вид:


Если смещение более короткое и может быть записано в одном байте, например, 2D, то машинное

представление команды следующее:


При (AX)=84A3, [(BX)+(DI)+disp8]=3474, [3474]=77, (IP)=0110 результат будет (AX)=FBA3, (IP)=0114 в первом случае и (IP)=0113 во втором.

Пример 9.

Операнд a находится в оперативной памяти по прямому адресу 3474. Адрес операнда b,

также находящегося в оперативной памяти, содержится в регистре SI.

Сложение этих операндов невозможно выполнить, используя только одну команду, так как система команд не предусматривает

сложения операндов формата "память-память". Поэтому одним из возможных вариантов решения этого примера может быть:

MOV AX,[SI]; AX=b  ADD [3474h],AX; a=a+b  

Кодирование каждой из этих команд проводится по рассмотренным выше правилам.

Кодирование команд переходов

Кодирование команд переходов и циклов имеет определенную специфику. Рассмотрим машинное представление этих команд подробнее.

При безусловном внутрисегментном прямом переходе новое значение IP равно сумме 8- или 16-разрядного

смещения и текущего значения IP.

В качестве текущего значения IP используется адрес команды, записанной вслед за командой перехода. Схема выполнения

операции представлена на, где предполагается, что перед вычислением адреса перехода содержимое IP уже указывает

на команду, следующую за командой перехода.

Команда, имеющая 8-разрядное смещение, называется командой короткого перехода и имеет в символической записи

после мнемоники команды префикс short.

Смещение записывается в дополнительном коде, который перед сложением с текущим значением IP расширяется знаком до 16 разрядов.

Таким образом, диапазон адресов переходов для команды короткого перехода составляет -128...+127

байтов относительно текущего значения IP.

Пример 1.

Команда JMP short L осуществляет передачу управления команде, помеченной меткой L.

Пусть эта команда перехода записана по адресу 010A. Тогда если метке L соответствует, например, адрес 011A,

то смещение в команде перехода будет равно:

011A - (010A+2)=011A-010C=011A+FEF4=0E  

Здесь операция вычитания заменена сложением с использованием дополнительного кода отрицательного числа.

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

Машинное представление команды следующее:


Обратим внимание на то, что в качестве текущего значения IP взят адрес команды перехода, увеличенный на 2,

так как длина самой команды перехода равна 2 байтам.

Если команда, помеченная меткой L, располагается по адресу 00C1, то смещение будет равно:

00C1-010C=00C1+FEF4=FFB5  

Полученное смещение имеет длину 2 байта, что недопустимо для данного формата команды.

Но так как старший байт представляет собой знаковое расширение младшего байта (FFB5h = 11111111 10110101b),

то это смещение можно закодировать в 1 байте, и команда будет иметь машинное представление: EBB5h.

Если метке L соответствует адрес 0224, то необходимая величина смещения, равная 0224-010C=0118,

не может быть записана в 8-разрядном формате. Следовательно, с помощью команды короткого

перехода осуществить переход на указанный адрес невозможно.

Пример 2.

По машинному представлению команды перехода можно определить, на какой адрес в сегменте команд будет

передано управление.

Так команда, имеющая машинный код EB4Ch и расположенная по адресу 0100h, осуществляет передачу управления

на команду с адресом: (0100+2)+004C=014E, а команда с кодом EBC4h, расположенная по тому же адресу,

осуществляет передачу управления по адресу (0100+2)+FFC4=00C6.

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

необходимо задавать 16-разрядное смещение.

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

Значение IP и 16-разрядное смещение суммируются как числа со знаком в дополнительном коде.

При этом, как и в предыдущем случае, перенос из 16-го разряда игнорируется.

Поэтому увеличение или уменьшение величины IP при выполнении этой команды зависит не от знака смещения,

а от соотношения текущего значения IP и смещения.

Рассмотрим это положение на следующем примере.

Пример 3.

Пусть команда JMP near L имеет машинное представление E964A6h. Тогда если она расположена по адресу 310A,

то управление будет передано на команду с адресом:

(310A+3)+A664=D771  

Если команда перехода находится по адресу C224, то управление будет передано на команду с адресом 688B (C224+3+A664 с учетом игнорирования переноса за пределы 16-разрядной сетки).

В первом случае переход произошел в сторону больших, а во втором - в сторону меньших адресов.

Отметим, что здесь текущее значение IP на 3 больше адреса команды близкого прямого перехода, так как сама

эта команда имеет длину 3 байта.

Внутрисегментную прямую адресацию часто называют относительной адресацией, так как здесь смещение вычисляется

относительно текущего значения IP.

При внутрисегментном косвенном переходе содержимое IP заменяется значением 16-разрядного регистра или слова

памяти, которые адресуются полями md и r/m постбайта с помощью любого режима адресации, кроме непосредственного.

Схема этого действия представлена на.

Пример 4.

Команда JMP BX осуществляет переход к ячейке памяти, адрес которой равен содержимому регистра BX.

Машинное представление этой команды:

Если в BX записано число 2976, то вне зависимости от текущего значения IP управление будет передано на команду,

записанную, начиная с адреса 2976.

Пример 5.

Команда JMP [BX]+A4h имеет машинное представление:

Если содержимое регистра BX равно 2976, то адрес перехода будет взят из слова оперативной памяти,

содержащегося в сегменте данных по адресу: 2976+A4=2A1A.

Команды межсегментных переходов меняют как содержимое IP, так и содержимое CS.

Команда межсегментного прямого перехода имеет в символической записи префикс far и заносит в IP и

CS новые значения, заданные в самой команде.

Пример 6.

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

другом программном сегменте со следующими координатами: (CS)=AA66, (IP)=11C2. Символическая запись такой команды перехода будет следующей:

JMP far L  

а ее машинное представление:

При межсегментном косвенном переходе новые значения IP и CS содержатся не в самой команде,

а в двух смежных словах оперативной памяти. Адрес этой области памяти определяется

постбайтом команды перехода в любом режиме адресации, кроме непосредственного и прямого регистрового. Схема выполнения команды представлена на

Отличие внутрисегментного косвенного перехода от межсегментного косвенного в символической записи команды определяется

типом используемого операнда. Если операнд определен как слово, предполагается внутрисегментный переход, а если как двойное слово - межсегментный.

В сомнительных случаях тип перехода может задаваться явным образом с помощью префиксов word ptr и dword ptr соответственно для внутрисегментного и межсегментного переходов.

Пример 7.

Пусть (BX)=24A4, [24A4]=11, [24A5]=12, [24A6]=13, [24A7]=5A.

Тогда команда JMP dword ptr [BX] имеет машинное представление


и передает управление команде, расположенной в кодовом сегменте (CS)=5A13 со смещением (IP)=1211.

Команда JMP word ptr [BX] имеет машинное представление


и передает управление команде, расположенной в том же кодовом сегменте со смещением (IP)=1211.

Команды условных переходов являются только внутрисегментными. В них значение указателя команд IP, соответствующее

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

При невыполнении проверяемого условия в IP остается его текущее значение, то есть адрес команды,

следующей за командой условного перехода.

Пример 8.

Пусть команда JZ L расположена по адресу 2010h, а метка L соответствует адресу 2072h.

Получим машинное представление этой команды.

Смещение будет равно:

2072 - (2010+2)=2072+DFEE=0060  

Это число со знаком может быть закодировано в 1 байте, следовательно, такой переход возможен.

Используя код команды из табл. 6.4, получим машинное представление этой команды: 7460 h.

Рассматриваемая команда передаст управление по адресу 2072, если к моменту ее выполнения ZF=1. При состоянии признака ZF

регистра флагов, равном нулю, управление будет передано следующей команде, то есть по адресу 2012.

Теперь рассмотрим пример кодирования команд, представляющих собой некоторый законченный в смысловом

отношении фрагмент программы.

Необходимо сложить l слов a[i], расположенных последовательно в оперативной памяти, начиная с адреса [31A6h],

а результат записать по адресу [3000h].

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

что конечный и промежуточные результаты не превышают длины слова. Количество слагаемых также занимает слово и записано

перед исходным массивом, то есть по адресу 31A4h. Начальное значение IP взято произвольно.

Таблица 8.1. Пример программы
Символическая запись Комментарий IP Машинное представление
2-й код 16-й код
MOV CX,[31A4h] CX = l 0100

10001011

00001110

10100100

00110001

8B

0E

A4

31

SUB AX,AX S = 0 0104

00101001

11000000

29

C0

MOV SI,AX i = 0 0106

10001011

11110000

8B

F0

CYC: ADD AX,[SI+31A6h] S = S+a[i] 0108

00000011

10000100

10100110

00110001

03

84

A6

31

ADD SI,2 i = i+1 010C

10000011

11000110

00000010

83

C6

02

DEC CX l = l-1 010F

01001001

49

JNZ CYC перейти, если l 0 0110

01110101

11110110

75

F6

MOV [3000h],AX SUM = S 0112

10100001

00000000

00110000

A1

00

30

Отметим некоторые особенности использования отдельных команд этой программы.

Обнуление регистра AX осуществляется вычитанием его содержимого из самого себя. Переход к новому

слагаемому достигается использованием

регистровой относительной адресации с изменением на каждом шаге содержимого индексного регистра на

длину слагаемого, то есть на 2.

Последняя команда, засылка результата, закодирована в специальном формате работы с аккумулятором.

Восстановление символической записи команды по ее машинному представлению

Для специалиста, работающего с компьютером как на программном, так и на аппаратном уровне,

иногда возникает необходимость

идентифицировать командную информацию, хранящуюся в оперативной памяти. Это может потребоваться,

например,

в случае программно-аппаратного сбоя, причину и место которого трудно определить традиционными методами и

средствами тестирования и отладки программ. Так как исполняемый модуль программы хранится в памяти

в машинном представлении,

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

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

Рассмотрим несколько примеров подобных преобразований. Для правильной интерпретации команды необходимо

знать положение ее первого байта. В рассматриваемых примерах будем полагать, что оно известно.

Пример 9.

Представить символическую запись команды, имеющей следующую машинную форму: 0000h.

Так как поля команды определяются с точностью до бита, то необходимо сначала перейти от шестнадцатеричного

к двоичному представлению команды и, исходя из общих принципов кодирования команд, определить назначение всех ее разрядов:


По таблице машинного представления команд (см. табл. 6.4) определим, что КОП=000000 b соответствует общему

формату операции сложения ADD. Тогда два младших бита первого байта кодируют признаки d и w, а второй байт

является постбайтом, определяющим режимы адресации операндов, участвующих в операции. Значение полей в

постбайте позволяет определить, что операндами будут регистр AL (reg=000, w=0) (см. табл. 6.1) и байт памяти,

адресуемый с помощью базово-индексной адресации через регистры BX и SI (md=00, r/m=000) (см. табл. 6.2). Значение d=0 указывает, что

регистр AL является операндом-источником.

Следовательно, символическая запись команды имеет вид:

ADD [BX+SI],AL  

Пример 10.

Представить символическую запись команды, имеющей следующую машинную форму: 81475D398B h.

Переходим к двоичному представлению команды:


Первый байт, согласно таблице машинного представления команд, соответствует команде сложения с непосредственным

операндом. Постбайт в этом случае кодирует местоположение лишь одного операнда, которое определяется

полями md и r/m: (BX)+disp8 (см. табл. 6.2), а среднее поле постбайта является расширением кода операции.

Адресация операнда требует указания в команде 8-разрядного смещения. Оно помещается сразу же за постбайтом.

Последние байты команды кодируют непосредственный операнд. Значение sw=01 в первом байте команды

указывает на то, что непосредственный операнд - 16-разрядный. Учитывая, что при кодировании в команде д

вухбайтовых величин сначала записывается их младший байт, получим следующую символическую запись команды:

ADD [BX+5D],8B39h  

Пример 11.

Пусть машинная форма представления команды следующая: 0445h. Тогда ее двоичный вид:


По таблице машинного представления команд определяем, что это команда специального формата,

обеспечивающая суммирование аккумулятора с непосредственным операндом.

Так как w=0, то непосредственный операнд имеет длину 1 байт, а в качестве аккумулятора используется регистр AL.

При этом команда имеет следующий вид:

ADD AL,45h  

Оценка влияния структуры программы на время ее выполнения

Время выполнения программы складывается из времен выполнения каждой команды программы.

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

выполнения команды, на длительность такта. Это время можно выразить в виде суммы базового времени

выполнения, которое зависит от типа команды, и времени вычисления эффективного адреса, если операнд

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

выбрана из памяти и находится в очереди команд. В противном случае требуется учесть длительность

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

Базовые времена выполнения некоторых команд приведены в табл. 9.1. Время вычисления эффективного

адреса (ЕА) зависит от режима адресации. Последний столбец в показывает число

обращений к памяти, необходимых для выполнения команды. Чтобы определить время выполнения

команды, следует учесть выравнивание операнда, то есть его расположение в оперативной памяти.

Обращение к однобайтному операнду не требует дополнительных тактов синхронизации. Время обращения

к слову памяти зависит от его адреса. Если слово имеет нечетный адрес, то его передача из оперативной

памяти занимает 2 цикла шины, длящихся по 4 такта синхронизации каждый. Следовательно, каждое о

бращение к слову с нечетным адресом требует четырех дополнительных тактов синхронизации.

Таблица 9.1.
Команды Адресация Число тактов Число обращений к памяти
ADD, SUB, AND, OR

RR

RS

SR

RI, AI

SI

3

9+EA

16+EA

4

16+EA

0

1

2

0

2

MOV

SA, AS

RR

RS

SR

RI

SI

10

2

8+EA

9+EA

4

10+EA

1

0

1

1

0

1

MUL

множитель 8 бит -R

множитель 16 бит -R

множитель 8 бит -S

множитель 16 бит -S

70…77

118…133

(76…83)+EA

(124…139)+EA

0

0

1

1

CMP

RR

RS, SR

RI, AI

SI

3

9+EA

4

10+EA

0

1

0

1

INC, DEC

16 бит - R

8 бит - R

S

2

3

15+EA

0

0

2

Условные переходы, кроме JCXZ

нет перехода

есть переход

4

16

0

0

LOOP

нет перехода

есть переход

5

17

0

0

JMP

короткий

внутрисегментный

прямой

косвенный

регистровый

межсегментный

прямой

косвенный

15

-

15

18+EA

11

-

15

24+EA

0

-

0

1

0

-

0

2

Примечание: R - адресация к регистру; A - к аккумулятору; S - к памяти; I - непосредственная адресация

Таблица 9.2.
Режим адресации Число тактов синхронизации для вычисления эффективного адреса
Прямой 6
Косвенный 5
Относительный 9

Базово-индексный

(BP)+(DI) или (BX)+(SI)

(BP)+(SI) или (BX)+(DI)

-

7

8

Относительный базово-индексный

(BP)+(DI)+disp или (BX)+(SI)+disp

(BP)+(SI)+disp или (BX)+(DI)+disp

-

11

12

Если при вычислении физического адреса производится замена сегмент-ного регистра (вместо заданного по умолчанию

используется другой, опре-деленный префиксом замены), то время выполнения команды увеличивает-ся на 2 такта.

Базовое время выполнения некоторых команд зависит также от значения операндов. Типичными примерами этого с

лужат команды умножения и деления (см. табл. 9.1). Так, время выполнения команды умножения, реализованной по

алгоритму умножения дополнительных кодов с пропуском такта суммирования, определяется количеством пар соседних

несовпадающих разрядов (01 или 10), так как при комбинациях 00 или 11 такт суммирования с нулевым слагаемым

отсутствует. Поэтому, например, для 8-разрядных операндов максимальное время умножения будет при значении

множителя 01010101, а минимальное - при ненулевом множителе 10000000 (напомним, что числа в персональной

ЭВМ представляются в дополнительном коде, поэтому указанный код соответствует числу -128). То есть в первом

случае команда умножения будет выполняться на 7 тактов суммирования дольше, что соответствует значениям, приведенным в табл. 9.1.

Для команд условного перехода в табл. 9.1 приведено два времени: меньшее соответствует случаю, когда условие

не выполняется и переход не производится, а большее соответствует реализации перехода. Во втором случае

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

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

что частота синхронизации равна 100 МГц (длительность такта 10 нс).

Пример 1.

ADD ES:[BX],DX  

Команда формата "память-регистр".

Базовое время: 16+EA.

Время вычисления EA (регистровая косвенная адресация): 5 тактов.

Обозначение "ES:" в символической записи команды показывает, что в процессе формирования физического

адреса операнда происходит замена сегментного регистра. Вместо используемого по умолчанию при данном

режиме адресации сегментного регистра DS используется регистр ES. Эта операция требует 2 тактов синхронизации.

Команда обрабатывает слово. Если слово имеет нечетный адрес, то

Т=16+5+2+2*4=31 (такт)=310 (нс)  

Если слово имеет четный адрес, то

Т=16+5+2=23 (такта)=230 (нс)  

Пример 2.

MUL [BX]  

Умножение без знака содержимого AL на операнд, адрес которого задан в команде. Операнд находится в памяти.

Базовое время: (76...83)+EA.

Время вычисления EA (регистровая косвенная адресация): 5 тактов.

Т=(76...83)+5 = (81...88) тактов = (810...880) нс  

Пример 3.

JZ MET ; перейти на MET, если "ноль"  

Базовое время: 4 такта, если нет перехода, и 16 тактов, если переход выполняется.

Других затрат времени нет.

Т=4 такта=40 нс    перехода нет.  Т=16 тактов=160 нс  переход выполняется.  

Пример 4.

JMP dword ptr [SI+15] ; межсегментный косвенный переход.  

Базовое время: 24+EA.

Время вычисления EA (регистровая относительная адресация): 9 тактов.

Имеются 2 обращения к памяти за новыми значениями IP и CS.

Если адрес слова четный, то

Т=24+9=33 (такта)=330 (нс).  

Если адрес слова нечетный, то

Т=24+9+2*4=41 (такт)=410 (нс).  

Время выполнения линейного участка программы равно сумме времен выполнения всех команд этого участка.

Оценим время выполнения ветвящейся программы на примере следующей задачи:


Ниже представлен текст соответствующей программы в предположении, что A, B и y - переменные длиной 1 байт,

имеющие идентификаторы MA, MB и MY соответственно. Здесь и далее полагаем, что используемые адреса в

сегменте данных - четные. Рядом с каждой командой указано количество тактов синхронизации, необходимое

для ее выполнения (идентификаторы соответствуют прямому режиму адресации):

     MOV BL,5  ; 4       MOV AL,MA ; 10       CMP AL,MB ; 15       JG  OUT   ; 4/16       
INC BL    ; 3  OUT: MOV MY,BL ; 15  

Таким образом, если A>B, то программа выполняется за 60 тактов, в противном случае - за 51 такт.

Если оба случая равновероятны, то

Тср = (Т1+Т2)/2 = 55.5 (такта).  

В общем случае для данной программы

Тср = 4+10+15+16*p1+(4+3)*p2+15=44+16*p1+7*p2.  

где p1 и p2 - вероятности перехода в команде JG в случае выполнения и невыполнения условия соответственно (p1+p2=1).

Если известна количественная или хотя бы качественная оценка соотношения p1 и p2, то можно минимизировать

среднее время выполнения данного фрагмента программы.

Пусть известно, что A>B при 90% различных исходных данных. Тогда для рассмотренной программы:

Тср = 44+0.9*16+0.1*7=59.1 (такта).  

При обратном соотношении, то есть при p1=0.1:

Тср = 44+0.1*16+0.9*7=51.9 (такта).  

Следовательно, при p1=0.1 быстрее будет выполняться программа, меняющая условие перехода:

     MOV BL,6  ; 4       MOV AL,MA ; 10       CMP AL,MB ; 15       JNG OUT   ; 4/16       DEC BL   
 ; 3  OUT: MOV MY,BL ; 15  

Она дает то же самое среднее время выполнения программы при p1=p2, но выигрыш при p1>p2 и проигрыш при p1<p2.

В циклических программах тело цикла выполняется многократно. В силу этого целесообразно, по возможности,

минимизировать этот участок программы даже за счет увеличения времени выполнения подготовительных

операций и операций обработки результатов циклического участка.

Рассмотрим это положение на следующем примере. Пусть необходимо вычислить произведение двух целых

положительных чисел длиной в слово (S=M*N), не используя команду умножения. Предполагаем, что операнды

располагаются в памяти по эффективным адресам, вычисляемым как [SI+2A] и [1148h], а результат также не

превышает одного слова и должен быть записан в память по адресу [BX+SI]. Предполагаем также, что все

адреса в сегменте данных четные.

Решать задачу будем по следующей схеме:


Рассмотрим несколько возможных вариантов решения.

Вариант 1.

       MOV   [BX+SI],0   ; 17         MOV   AX,[1148h]  ; 10  CYCLE: ADD   [BX+SI],AX  ; 23    
     DEC   [SI+2A]     ; 24         JNZ   CYCLE       ; 4/16  

Вариант 2.

       MOV   AX,[1148h]  ; 10         MOV   CX,[SI+2A]  ; 17         SUB   DX,DX       
; 3  CYCLE: ADD   DX,AX       ; 3         DEC   CX          ; 2         JNZ   CYCLE      
 ; 4/16         MOV   [BX+SI],DX  ; 16  

Вариант 3.

       MOV   AX,[1148h]  ; 10         MOV   CX,[SI+2A]  ; 17         SUB   DX,DX       
; 3  CYCLE: ADD   DX,AX       ; 3         LOOP  CYCLE       ; 15/17         MOV   [BX+SI],DX  ; 16  

Вариант 1 использует минимальное общее количество команд. В варианте 2 обработка идет в

регистрах общего назначения, но не используется специальная команда цикла, которая использована в варианте 3.

Сравнительные характеристики этих вариантов представлены в табл. 9.3

Таблица 9.3.
Вариант Количество команд Длина программы, (байт) Время выполнения, (такт)
1 5 14 63N+15
2 7 15 21N+34
3 6 14 20N+34

Таким образом, даже несмотря на некоторое увеличение длины, программа, реализованная в вариантах

2 и 3, при достаточно больших N выполняется почти втрое быстрее, чем реализованная в варианте 1.

Так как время выполнения этих программ зависит от величины лишь одного сомножителя, то в том

случае, когда известны относительные величины сомножителей, это время можно минимизировать,

используя в качестве счетчика наименьший из сомножителей.

На главную | Содержание | < Назад....Вперёд >
С вопросами и предложениями можно обращаться по nicivas@bk.ru. 2013 г.Яндекс.Метрика