КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
N DEF nNUM1 def ? NUM2 def ? NUM3 def ? … … NUMn def ? Рис. 5.8. Программа для процессоров IA-32, выполняющая сложение последовательности чисел; Обработка списков и массивов всегда требует внимательности, особенно при выборе условия перехода и метода индексации — с нуля или единицы. Неверный выбор может привести к ошибкам в программе. В языках высокого уровня эта задача упрощается, поскольку к элементам списка можно явно обращаться как к LIST(0), LIST(1), ..., LIST(n-l), а начало и конец цикла можно явно связать со значениями индекса при помощи таких выражений, как FOR I FROM 0 UPTO (n-1) или FOR I FROM (n-1) DOWNTO 0 Это краткое описание некоторых из числа наиболее часто используемых команд IA-32 и примера программного цикла можно считать введением в систему команд и язык ассемблера IA-32. В следующем разделе рассматривается машинное представление команд этого семейства процессоров. Формат машинных команд Общий формат машинных команд процессоров IA-32 показан на рис. 5.9. Команды имеют переменную длину — от 1 до 12 байт и могут включать до четырех полей. Команды длиной в 1 байт содержат только обязательное поле кода операции. Как правило, длина этого поля составляет 1 байт, иногда — 2 байта. Информация о режиме адресации содержится в одном или двух байтах, следующих за полем кода операции. В тех командах, где для формирования исполнительного адреса операнда используется только один регистр, поле режима адресации имеет длину 1 байт. Второй байт нужен для кодирования двух последних режимов адресации (см. табл. 5.1). В этих режимах для формирования исполнительного адреса операнда нужно иметь 2 байта. Если для вычисления исполнительного адреса операнда требуется указать смещение, его значение записывается в один или два байта в поле, следующем за полем режима адресации. Если один из операндов задается непосредственно, он помещается в последнее поле команды и занимает 1 или 4 байта. Для ряда простых команд, подобных тем, о которых рассказывалось в предыдущем разделе, код используемого регистра задается прямо в байте кода операции. Однако для большинства команд и режимов адресации регистры задаются в поле режима адресации. Во многих системах команд в тех случаях, когда таковые имеют переменную длину, в начале двоичного представления команды должна быть задана ее длина. Связано это с тем, что последовательные команды располагаются в памяти друг за другом, без указания границ между ними. Рис. 5.9. Формат команды IA-32 Однобайтовые команды Команды INC и DEC, предназначенные для уменьшения и увеличения значения регистра, имеют длину 1 байт. Например, в командах INC EDI и DEC ECX регистры общего назначения EDI и ECX задаются 3-битовыми кодами в байте кода операции. Кодировка непосредственной адресации Режим непосредственной адресации задается в поле кода операции. Например, команда MOV ЕАХ,820 имеет длину 5 байт. В однобайтовом поле кода операции определяется операция пересылки, указывается, что операнд задан непосредственно и имеет длину 32 разряда, а также задается имя регистра назначения. За кодом операции следует 4-байтовое значение 820. Если непосредственно заданный операнд имеет длину 8 бит, то для команды MOV DL,5 достаточно 2 байт. Режимы адресации и поля смещения Если команда имеет два операнда, то один из них должен содержаться в регистре, а другой — либо в регистре, либо в памяти. Для этого правила имеются два исключения, когда оба операнда могут находиться в памяти. Одно из них касается команд, в которых первый операнд задается в режиме непосредственной адресации, а второй — в режиме прямой адресации. Другое исключение относится к операциям проталкивания и выталкивания значений из стека процессора. Стек располагается в памяти в сегменте стека, и в него можно поместить значение из памяти, а можно вытолкнуть из него значение в память. Эти операции подробно описаны в разделе6.6. Когда оба операнда находятся в регистрах, для поля режима адресации достаточно одного байта. Например, команда ADD EAX,EDX занимает 2 байта. В первом из них содержится код операции, а во втором — коды двух регистров. Рассмотрим несколько примеров кодирования команд, один операнд которых располагается в памяти, а другой в регистре. Команда MOV ECX,N в программах на рис. 5.4 кодируется 6 байтами: один для кода операции, один для поля адресного режима, в котором задается режим прямой адресации и регистр ЕСХ, и четыре байта для адреса памяти N. Для кодирования команды ADD EAX,[EBX+EDI*4] в тех же программах требуется 2-байтовое поле режима адресации, поскольку для вычисления исполнительного адреса исходного операнда используются два регистра. Во втором из этих байтов задается коэффициент масштабирования 4. Таким образом, для всех команд требуется три байта, с учетом байта для кода операции. Теперь рассмотрим команду MOV DWORD PTR[EBP+ESI*4+DISP],10 Директива ассемблера DWORD PTR указывает, что непосредственно заданный операнд 10 имеет длину 32 бита. В других языках ассемблера размер операнда часто определяется мнемоническим обозначением команды. Например, в языке процессора Motorola 68000 команда MOVEB определяет 1-байтовый операнд, а команда MOVEL — 4-байтовый. Если в команде задано 32-разрядное значение смещения DISP, для ее кодирования требуется 11 байт: один байт для поля кода операции, два — для поля режима адресации и по четыре байта для полей смещения и непосредственно заданного операнда. В табл. 5.1 указано, что смещение может иметь дину 8 или 32 бита. Его размер задается в первом из двух байтов поля режима адресации. При кодировании команд с двумя операндами спецификации регистровых операндов и операндов в памяти располагаются в строго определенном порядке, и регистровый операнд всегда задается первым. Для различения команды MOV EAX,LOCATION которая загружает в регистр ЕАХ содержимое памяти по адресу LOCATION, и команды MOV LOCATION,EAX
загружающей в память по адресу LOCATION содержимое регистра ЕАХ, в поле кода операции содержится бит, который называется битом направления. Он указывает, какой из операндов является исходным. Правила кодирования полей кода операции и адресного режима в архитектуре IA-32 довольно сложны, не всегда унифицированы и имеют множество исключений. И хотя это несколько затрудняет для компилятора использование всех возможностей системы команд и режимов адресации, архитектура IA-32, без сомнения, обладает большой гибкостью.
|