![]() |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Бесплатная доска объявлений: запись дисков. Мы тиражируем CD, DVD, miniCD. . программы для андроид санкт-петербург и ленинградская область . . вкс санкт-петербург . |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Кодирование команд
С целью лучшего понимания архитектуры ЭВМ рассмотрим машинное представление команд различных форматов, использующих различные режимы адресации операндов. Рассмотрим это на примере операции сложения. Так как в системе команд ЭВМ, базирующихся на микропроцессорах фирмы 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.
Пример 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 Кодирование каждой из этих команд проводится по рассмотренным выше правилам.
Восстановление символической записи команды по ее машинному представлениюДля специалиста, работающего с компьютером как на программном, так и на аппаратном уровне, иногда возникает необходимость идентифицировать командную информацию, хранящуюся в оперативной памяти. Это может потребоваться, например, в случае программно-аппаратного сбоя, причину и место которого трудно определить традиционными методами и средствами тестирования и отладки программ. Так как исполняемый модуль программы хранится в памяти в машинном представлении, то для лучшего понимания действий, выполняемых компьютером в определенный момент, целесообразно преобразовать команду к символическому виду. Программы, выполняющие такое преобразование, называются дизассемблерами. Рассмотрим несколько примеров подобных преобразований. Для правильной интерпретации команды необходимо знать положение ее первого байта. В рассматриваемых примерах будем полагать, что оно известно. Пример 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 такта синхронизации каждый. Следовательно, каждое о бращение к слову с нечетным адресом требует четырех дополнительных тактов синхронизации.
Примечание: R - адресация к регистру; A - к аккумулятору; S - к памяти; I - непосредственная адресация
Если при вычислении физического адреса производится замена сегмент-ного регистра (вместо заданного по умолчанию используется другой, опре-деленный префиксом замены), то время выполнения команды увеличивает-ся на 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
Таким образом, даже несмотря на некоторое увеличение длины, программа, реализованная в вариантах 2 и 3, при достаточно больших N выполняется почти втрое быстрее, чем реализованная в варианте 1. Так как время выполнения этих программ зависит от величины лишь одного сомножителя, то в том случае, когда известны относительные величины сомножителей, это время можно минимизировать, используя в качестве счетчика наименьший из сомножителей. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
С вопросами и предложениями можно обращаться по nicivas@bk.ru. 2009 г. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||