<< Вернуться у выбору материала

9. Лекция: Кодирование команд (часть 3)

Введите ваш запрос для начала поиска.

Свежая информация презентации ppt у нас.

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

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

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

Базовые времена выполнения некоторых команд приведены в табл. 9.1. Время вычисления эффективного адреса (ЕА) зависит от режима адресации (табл. 9.2). Последний столбец в табл. 9.1 показывает число обращений к памяти, необходимых для выполнения команды. Чтобы определить время выполнения команды, следует учесть выравнивание операнда, то есть его расположение в оперативной памяти. Обращение к однобайтному операнду не требует дополнительных тактов синхронизации. Время обращения к слову памяти зависит от его адреса. Если слово имеет нечетный адрес, то его передача из оперативной памяти занимает 2 цикла шины, длящихся по 4 такта синхронизации каждый. Следовательно, каждое обращение к слову с нечетным адресом требует четырех дополнительных тактов синхронизации.

Команды Адресация Число тактов Число обращений к памяти
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

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

Режим адресации Число тактов синхронизации для вычисления эффективного адреса
Прямой 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

Таблица 9.2.

Если при вычислении физического адреса производится замена сегментного регистра (вместо заданного по умолчанию используется другой, определенный префиксом замены), то время выполнения команды увеличивается на 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

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

Таблица 9.3.

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

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

Рейтинг@Mail.ru