Пример 4.
Пример 3.
Пример 2.
Пример 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 (нс)
MUL [BX]
Умножение без знака содержимого AL на операнд, адрес которого задан в команде. Операнд находится в памяти.
Базовое время: (76...83)+EA.
Время вычисления EA (регистровая косвенная адресация): 5 тактов.
Т=(76...83)+5 = (81...88) тактов = (810...880) нс
JZ MET ; перейти на MET, если "ноль"
Базовое время: 4 такта, если нет перехода, и 16 тактов, если переход выполняется.
Других затрат времени нет.
Т=4 такта=40 нс перехода нет.
Т=16 тактов=160 нс переход выполняется.
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.
Сравнительные характеристики этих вариантов представлены в табл. 7.4
Таблица 7.4. | |||
Вариант | Количество команд | Длина программы, (байт) | Время выполнения, (такт) |
63N+15 | |||
21N+34 | |||
20N+34 |
Таким образом, даже несмотря на некоторое увеличение длины, программа, реализованная в вариантах 2 и 3, при достаточно больших N выполняется почти втрое быстрее, чем реализованная в варианте 1.
Так как время выполнения этих программ зависит от величины лишь одного сомножителя, то в том случае, когда известны относительные величины сомножителей, это время можно минимизировать, используя в качестве счетчика наименьший из сомножителей.


![]() |
![]() | ![]() |
![]() |
![]() |
![]() |
|