Укажите и охарактеризуйте машинно зависимые этапы компиляции программы на некотором языке

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

8.1. Распределение памяти

Основные задачи этой фазы:

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

 Выделить память для всех констант.

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

A 05 Компиляция и линковка (Васюков А.В., 2019)

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

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

При выделении памяти используется счетчик адреса с нулевым начальным значением, которое затем меняется по мере распределения памяти. Фаза распределения памяти просматривает таблицы идентификаторов и констант и если встречается глобальная (статическая) переменная или константа, то выполняются следующие четыре шага:

(1) При необходимости выравнивается значение счетчика адреса.

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

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

(4) К содержимому счетчика адреса прибавляется вычисленная длина переменной или константы.

Если в нашем компиляторе все фазы жестко разделены, то после того, как всем статическим данным присвоен относительный адрес, в матрицу тетрад добавляется элемент, который дает возможность при генерации кода зарезервировать необходимое количество памяти. Для всех констант и переменных, которым присваивается начальное значение, в матрицу добавляются тетрады, указывающие, что фаза генерации кода должна поместить нужное значение в соответствующий участок памяти. Но в реальных компиляторах область статических данных объектного модуля формируется уже в процессе распределения памяти, а на фазе генерации кодов формируются лишь команды загрузки соответствующих сегментных регистров.

C++ с нуля | 08 | Компиляция и линковка

Временная память распределяется по-другому, поскольку любой оператор исходной программы может повторно использовать временную память (область промежуточных результатов), назначенную предыдущему оператору. Последовательность тетрад от начальной установки до последнего использования временной переменной Mi называют зоной ее существования. Приводимый ниже алгоритм Данцига-Рейнольдса позволяет минимизировать число используемых ячеек даже в тех редких случаях, когда зоны временных переменных Mi и Mj частично пересекаются.

Алгоритм использует стек C, который вначале содержит набор адресов памяти, предназначенных для временных переменных. При первой встретившейся записи в Mj, которая открывает зону Mj, из стека берется адрес и присваивается Mj (из стека этот адрес естественно выталкивается).

При последнем чтении из Mj, которое закрывает ее зону, адрес, присвоенный Mj, записывается в стек C, так как содержимое этой ячейки уже больше не нужно. Формирование адресов для временных переменных вполне можно совместить с генерацией кода. Алгоритм предполагает, что мы знаем тетраду, осуществляющую последнее чтение из Mj. Информацию об этом можно хранить в отдельном поле таблицы идентификаторов для каждой временной переменной.

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

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

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

Источник: studfile.net

Компиляция языков программирования

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

Читайте также:
Как отключить все программы на Айфоне

Чтобы обеспечить корректность интерпретатора, при его проектиро­вании мы должны исходить из семантического определения интерпрети­руемого языка или по меньшей мере верифицировать его на соответствие этому. Обратим внимание на то, что математическое определение семан­тики ЯП аналогично интерпретирующим программам.

Особое положение занимают интерактивные, инкрементальные (поша­говые) интерпретаторы. Для них не обязательно требуется сначала подго­товить всю программу целиком, включая вводимые данные, и только по­том ее интерпретировать. При интерактивной интерпретации можно программу и входные данные приготовить отдельными частями и полу­ченную часть — насколько это возможно — тут же проинтерпретировать (ЯП ВASIC специально ориентирован на инкрементальную интерпретацию).

Сейчас все ближе подходят к созданию интерпретаторов для таких языков, которые выглядят не так, как классические ЯП, ориентирован­ные на вычисления. В частности, в результате длительных исследований стала возможной интерпретация определенных языков, ориентированных скорее на спецификации, а не на вычисления (например, язык ПРОЛОГ, который служит для составления программ в машинно-интерпретируемой логике). Впрочем, для таких языков имеются определенные непре­одолимые преграды из-за границ вычислимости и сложности, которые для многих постановок задач делают практически невозможным исполь­зование этих языков.

Компилятор берет программу на исходномязыке в качестве своих входных данных и вырабатывает программу на объектном языке, понятном машине.

Если программу, написанную на ЯП высокого уровня, мы хотим выпол­нять многократно, со все новыми исходными данными, то часто бывает эффективнее программу не интерпретировать, а сначала перевести на уже реализованный язык, возможно более близкий к машинному языку, а затем уже выполнять порожденную таким образом программу. Такой способ позволяет лучше приспособить программу к структуре фактиче­ски используемой машины и тем самым добиться далеко идущей ее оп­тимизации. В принципе такой перевод можно осуществить вручную, од­нако это требует больших затрат времени и при этом могут быть допуще­ны ошибки. Поэтому для этой цели используются специальные переводящие программы, называемые переводчиками или компиляторами (англ. соmputer).

Компилятор и интерпретатор обычно являются довольно сложными программами, которые воспринимают программу на исходном языке в форме текста, устанавливают внутреннюю структуру так заданной про­граммы, проверяя при этом ее синтаксическую корректность (синтак­сический анализ), и переводят программу на другой (объектный) язык или выполняют эту программу путем соответствующих действий.

ЯП определяется его синтаксисом и семантикой. В процессе компи­ляции или интерпретации программа, понимаемая как синтаксический объект, берется в качестве входных данных и в соответствии с ее семан­тикой превращается в программу на другом языке или в последователь­ность действий (процесс выполнения).

Языки программирования бывают высокого и низкого уровней.

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

Языки высокого уровня позволяют задавать желаемые действия в программе с по­мощью определенного набора операторов. Они значительно ближе и понятнее человеку, чем компьютеру. Каждая команда такого языка может состоять из десятка и более команд микропроцессо­ра. Писать программы на ЯП ВУ легче.

1 – машинно-зависимые (Ассемблер). Языки низкого уровня.

2 – машинно-ориентированные (Си)

3 – универсальные (Фортран, Паскаль, Basic)

4 — проблемно-ориентированные (GPSS, Лого, объектно-ориентированные (форт, Смолток))

5,6,7 – (Пролог, Лисп, СНОБОЛ).

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

Фортран – первый язык высокого уровня (1958г., фирма IBM), используется и до сих пор, поддерживает модульное программирование, особенно предпочитается математиками.

Паскаль – один из наиболее популярных в учебных целях (Н.Вирт), реализует большинство идей структурного программирования.

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

Лого, среди проблемно-ориентированных языков – используется в основном для целей обучения. Это диалоговый процедурный язык (простой синтаксис).

GPSS – ориентирован на моделирование систем с помощью событий. Применяется там, где результаты исследований выражаются в терминах времени ожидания, длины очереди, использование ресурсов.

Смолток – один из ранних ОО ЯП, основная конструкция – это объект и действия с ним, предназначен для нечисловых задач (при построении систем искусственного интеллекта).

Форт – используется при решении задач имитационного моделирования в графических системах.

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

Пролог – язык ИИ, даются термины и связи, а с его помощью создаются новые.

Лисп – имеет мощные графические конструкции, позволяет создавать программы проектирования (деталей, например). Он ориентирован на конструкторскую деятельность. Имеет библиотеку примитивов.

СНОБОЛ – язык ИИ.

Поколения языков программирования

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

1. Начало 50-х годов. Появились первые компьютеры и первые языки ассемблера, в которых программирование велось по принципу «Одна инструкция — одна строка».

2. Конец 50-х начало 60-х годов. Разработан символический Ассемблер, в котором появилось понятие переменной. Возросла скорость разработки и надежность программ.

3. 60-е года. Рождение языков высокого уровня. Простота программирования, не­зависимость от конкретного компьютера, новые мощные языковые конструк­ции.

4. Начало 70-х и по настоящее время. Проблемно-ориентированные языки, опери­рующие конкретными понятиями узкой предметной области. Мощные операто­ры, для которых на языках младшего поколения потребовались тысячи строк исходного кода.

5. Середина 90-х. Системы автоматического создания прикладных программ с помощью визуальных средств разработки, без знания программирования. Инст­рукции вводятся в компьютер в наглядном виде с помощью методов, наиболее удобных для человека незнакомого с программированием.

Читайте также:
Как оформить программу кружка

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

Источник: studopedia.su

Машинно-зависимые языки и основы компиляции

Программирование на языке Python (§ 54 - § 61)

Структура дисциплины
Лекции (34 часа):
структура процессора IA-32 и система машинных команд;
язык ассемблера (среда RADAsm для Masm32);
связь разноязыковых модулей;
основы построения компиляторов;
макросредства ассемблера
Семинары (8 занятий): подготовка к лабораторным работам.
Лабораторные работы: 4 занятия по 4 часа – 5 лабораторных работ.
Домашние задания: 1-е – 10 неделя, 2-е – 16 неделя.
Контроль знаний:
Рк1: Структура машинной команды (6 неделя)
КР1: Ветвления и циклы (10 неделя)
Рк2: Правила передачи параметров (13 неделя)
КР2: Основы конструирования компиляторов (16 нед.)
Экзамен — 18..30 баллов.
– 6..10 баллов.
– 15..25 баллов.
– 6..10 баллов.
– 15..25 баллов.
2

3.

Литература не покрывает курса!
Основная литература
1.
Г.С. Иванова, Т.Н. Ничушкина. Главы 1-4. Учебные пособия в эл. виде.
Дополнительно:
1.
Юров В.И. Assembler. Учебник для вузов. – СПб.: Питер, 2010. – 637 с.
2.
Пирогов В.Ю. Ассемблер. Учебный курс. – СПб.: БХВ-Петербург, 2003.
3.
Пирогов В.Ю. Ассемблер для Windows. – СПб.: БХВ-Питербург, 2007.
4.
Ирвин К. Язык ассемблера для процессоров Intel. – М.: ИД «Вильямс», 2005.
5.
Грис Д. Конструирование компиляторов для цифровых вычислительных
машин. – М.: Мир, 1975.
6.
Ахо А., Ульман Дж. Теория синтаксического анализа, перевода и компиляции.
7.
Аблязов Р. Программирование на ассемблере на платформе х86-64. – М.:
ДМК Пресс, 2011.
8.
Зубков С.В. Assembler. Для Dos, Windows и Unix. – М.: ДМК Пресс, 2015. 4

4.

2018
Глава 1 Организация
ядра ЭВМ на базе IA-32
МГТУ им. Н.Э. Баумана
Факультет Информатика и системы управления
Кафедра Компьютерные системы и сети
Лектор: д.т.н., проф.
Иванова Галина Сергеевна

5.

1.1 Архитектура вычислительной системы
на базе процессоров IA-32
Архитектурой ВС называют совокупность основных характеристик
системы, определяющих особенности ее функционирования.
Архитектура «с общей
шиной» предполагает,
что основные устройства
ВС взаимодействуют через единственную шину,
называемую системной,
которая включает:
• шину адреса;
• шину данных;
• шину управления.
Центральный процессор:
IA-32, IA-64 и другие.
6

6.

64 разрядные процессоры
Различают 2 совершенно разные, несовместимые друг с другом,
микропроцессорные архитектуры:
Intel 64 – это Pentium 4 (последние модели), ряд моделей Celeron D,
семейство Core 2 и некоторые модели Intel Atom;
IA-64 – это семейства Itanium и Itanium 2, предназначены для серверов.
Процессоры архитектуры Intel 64 поддерживают два режима работы:
Long mode — позволяет выполнять 64-битные программы; есть поддержка
выполнения 32-битных приложений, но устранены сегментная модель
памяти, аппаратная поддержка мультизадачности и т.п.;
Legacy mode («наследственный», режим совместимости с x86) —
предоставляет полную совместимость с 32/16-битным кодом и
операционными системами.
Таблица — Процессоры (февраль 2010)
7

7.

Оперативная память
Оперативная память ВС организована как последовательность байт,
которым соответствуют номера – целые числа от 0: 0,1,2 и т.д.
Номер байта является его физическим адресом.
Для данного класса систем приняты следующие обозначения:
слово (word) – 2 байта = 16 бит;
двойное слово (double word — dword) – 2 слова = 32 бита;
учетверенное слово (qword) – 2 двойных слова = 64 бита.
Кроме этого используются:
параграф – 16 байт;
страница – 256 (512, 4096) байт.
Младшие части чисел в оперативной памяти располагаются в
младших адресах.
Младший байт
Старший байт
Номера бит в байте: 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
Номера бит в слове: 7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8
8

8.

Типы обрабатываемых данных
целые числа – представляются в двоичной системе счисления, со
знаком или без знака, длиной 1, 2, 4 байта, если число – со знаком,
то старший бит содержит знак;
вещественные числа – представляются в двоичной системе
счисления в виде мантиссы со знаком и порядка общей длиной от 4
до 10 байт;
двоично-кодированные десятичные числа со знаком, длиной до
16 байт – тип больше не используется;
символы (ASCII, ANSI, Unicode), длиной 1 или 2 байта
9

9.

1.2 Программная модель процессора i8086
Под программной моделью процессора понимается совокупность его
характеристик, существенных для разработки программного
обеспечения.
В общем случае, программная модель процессора включает описание:
способов адресации памяти;
регистров;
форматов данных;
системы команд
10

10.

Структура процессора i8086
11

11.

Сегментная модель 16-ти разрядной адресации
памяти
Схема адресация «база +смещение»: Aф = Aб + Асм
0
1
2
3 4
5
6
7 …
Адрес базы
Смещение
Сегментная схема адресации микропроцессора i8086:
16-разрядный сегментный адрес
Добавляются
аппаратно
0000
16-разрядное смещение в сегменте
20-ти разрядный физический адрес
Сегмент при 16-ти разрядной адресации – фрагмент памяти размером
12
не более 64 кбайт, который начинается с адреса, кратного 16.

12.

Адресация сегментов различных типов
Программа размещается в сегментах трех типов, каждый из которых
адресуется одним из сегментных регистров и регистром или
регистрами, содержащими смещение.
1. Сегмент кода: Сегментный
CS: IP
2. Сегмент стека:
SS:SP
адрес
Смещение
в сегменте
3. Основной и дополнительный сегменты данных:
BX + DI +
BX + SI +
BP + DI +
DS: BP + SI +
ES: BX +
BP +
Сегм.
База
Индекс
Сегм.
SI +
DI +
13

13.

Схема 16-ти разрядной адресации памяти
Исполнительный адрес
(смещение в сегменте)
Индекс SI, DI
База
Непосред.
смещение
BX, BP
Disp
+
ОП
Исполнительный
адрес (16)
Указатель
(32)
Блок преобразования
адресов
Сегментный
адрес (16)
Сегментныйрегистр
регистр
Сегментный
Сегментный
регистр
SS
Сегментный
регистр
ES
DS
CS
Физический
адрес (20)
1Мб
14

14.

Система машинных команд i8086. Форматы команды MOV
Префиксы
Код
операции
1 байт
адресации
Рег-р/память
регистр
100010DW
Mod Reg R/M Смещение
млад. байт
Смещение
стар. байт
Литерал
рег-р/память
1100011W
Mod 000 R/M
Смещение
млад. байт
Смещение
стар. байт
D — 1- в регистр, 0 — из регистра
W — 1- операнды-слова, 0 — байты
W=1
Reg 000 AX
001 CX
010 DX
011 BX
100 SP
101 BP
110 SI
111 DI
W=0
000 AL
001 CL
010 DL
011 BL
100 AH
101 CH
110 DH
111 BH
Sr
00
01
10
11
ES
CS
SS
DS
2 байта
смещения
2 байта
данных
Данные
Mod — 00 – смещение Disp=0 байт
01 – смещение Disp=1 байт
10 – смещение Disp=2 байта
11 – операнды-регистры
M = 000
001
010
011
100
101
110
111
EA=(BX)+(SI)+Disp
EA=(BX)+(DI)+Disp
EA=(BP)+(SI)+Disp
EA=(BP)+(DI)+Disp
EA=(SI) + Disp
EA=(DI) + Disp
EA=(BP) + Disp *
EA=(BX) + Disp 15

Читайте также:
Можно ли удалять обновления программ

15.

Примеры машинных команд
Примеры:
1) mov BX,CX
Команды с регистрами
AL,AX имеют особый
формат!
89 CB
100010DW Mod Reg Reg
10001001 11 001 011
2) mov
CX,6[BX]
8B
4F
06
100010DW Mod Reg Mem См.мл.байт
10001011 01 001 111 00000110
3) mov
byte ptr 6[BX],10
C6
47
06
0A
1100011W Mod 000 Mem См.мл.байт Данные
11000110 01 000 111 00000110 00001010
16

16.

1.3 Программная модель процессоров IA-32
Процессоры IA-32 могут функционировать в одном из трех режимов:
реальной адресации (Real address mode) – процессор работает как
процессор i8086, адресует только 1 Мб памяти, с использованием 32х разрядных расширений, например, 32-х разрядных регистров или
команд перехода в защищенный режим;
защищенном (Protected mode) – процессор работает с 32-х
разрядными адресами и при этом использует сегментную и, как
правило, страничную модели памяти;
управления системой (System Management mode) – для выполнения действий с возможностью их полной изоляции от прикладного
программного обеспечения и операционной системы. Переход в режим возможен только аппаратно. Используется для выполнения таких
операции, как переход в энергосберегающее состояние.
18

17.

Схема 32-х разрядной адресации
Эффективный адрес
Страницы
по 4 Кб
Индекс
База
Непосредственное
смещение
x
Масштаб
+
Виртуальный
адрес (46)
Индекс
сегмента (14)
Эффективный
адрес (32)
Блок
разбивки
Блок сегментации
Линейный на страницы
адрес (32)
Физический
Селектор 2 0
адрес (32)
(Сегментный регистр)
Базовые адреса
ОП
сегментов
Селектор
Таблица
локальных
Селектор
дескрипторов
Селектор
Таблица
глобальных
Селектор
дескрипторов
19

18.

Плоская модель памяти Flat
Модель памяти Flat используется в приложениях Windows:
база = 0;
граница совпадает с объемом доступной оперативной памяти;
сегмент кода, сегмент данных и сегмент стека располагаются в одном и том
же пространстве адресов, которое разделено между указанными
сегментами.
Начальные адреса памяти отводятся для размещения операционной системы. В
связи с этим все модули компонуются не с начальных адресов, а с базового
адреса в сегменте — 0x400000. в PE формате, несмотря на то, что сам
формат позволяет выравнивать секции на 512 байт, используется
выравнивание секций на границу 4 кб, меньшее выравнивание в Windows не
считается корректным.
Адресное пространство приложения
0
Windows
Сегмент стека
Сегмент данных
Сегмент кода
Поскольку аналогично адресуются все приложения, защита сегментов не
работает (нельзя писать в сегмент кода, но можно в сегмент данных,
расположенный в том же пространстве). Работает только защита страниц.
20

19.

Основные блоки процессора IA-32
Исполнительный блок
Блок
управления
сегментами
Блок
разбиения
на страницы
Блок
декодирования команд
Блок
предвыборки
команд
Блок
интерфейса с
магистралью
32-разрядная
шина адреса
32-разрядная
23
шина данных

20.

Регистры процессоров семейства IA-32
1. Регистры данных (32-х разр.):
AL
BL
CL
DL
AH
BH
CH
DH
SI
DI
BP
SP
EAX
EBX
ECX
EDX
ESI
EDI
EBP
ESP
2. Селекторы (16-ти разр.):
CS
SS
DS
ES
FS
GS
IP
3. Регистр указатель команд (32):
FLAGS
4. Слово системных флагов (32):
5. Управляющие регистры: CR0..CR3
6. Регистры системных адресов:
GDTR – регистр адреса таблицы глобальных дескрипторов;
LDTR – регистр адреса таблицы локальных дескрипторов;
IDTR – регистр адреса таблицы дескрипторов прерываний;
TR – регистр состояния задачи;
7. Отладочные регистры
8. Тестовые регистры
EIP
EFLAGS
24

21.

Системные флаги
Флаги статуса CF, PF, AF, ZF, SF и OF отражают статус выполнения
арифметических инструкций (таких как ADD, SUB, MUL, DIV).
CF – флаг переноса (Carry Flag).
PF – флаг четности (Parity Flag).
AF – флаг вспомогательного переноса (Adjust Flag).
ZF – флаг нуля (Zero Flag).
SF – флаг знака (Sign Flag).
OF – флаг переполнения (Overflow Flag).
DF – флаг направления (Direction Flag)
Системные флаги и поле IOPL влияют на процесс исполнения задачи, и
поэтому не должны изменяться прикладной программой.
25

22.

Система команд семейства процессоров IA-32
Размер команды от 1 до 15 байт:
Команды с регистрами
AL,AX,EAX имеют
особый формат!
d – направление: 1 – в регистр, 0 – из регистра;
w – 1 – операнды — двойные слова, 0 – байты;
mod — 00 — Disp=0 – смещение в команде 0 байт;
01 — Disp=1 – смещение в команде 1 байт;
10 — Disp=2 – смещение в команде 4 байта;
11 — операнды-регистры.
Sib присутствует, если:
• операнд находится в
памяти;
• поле m = 100.
26

23.

Регистровые команды
W=1
000
EAX
001
ECX
010
EDX
011
EBX
100
ESP
101
EBP
110
ESI
111
EDI
W=0
000
AL
001
CL
010
DL
011
BL
100
AH
101
CH
110
DH
111
BH
Примеры:
1) mov EBX,ECX
89 CB
В режиме use32 префикс
66h определяет
16-ти разрядный операнд
100010DW Mod Reg Reg
10001001 11 001 011
2)mov
BX,CX
префикс1 100010DW Mod Reg Reg
01100110 10001001 11 001 011
66
89 CB
27

Источник: ppt-online.org

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru