Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
ЛЕКЦИЯ 5
АДРЕСАЦИЯ ПАМЯТИ
План лекции
1. Режимы адресации.
2. Сегментация памяти в процессоре х86.
3. Система команд.
1. Режимы адресации.
Некоторые команды работают с данными, содержащимися в самой ко-
манде или в регистрах CPU, т. е. они не обращаются к памяти. Это примеры
непосредственного и регистрового режима адресации. В команде MOV
AX,7FH используются оба эти режима.
Когда программа обращается к памяти, она должна сообщить компью-
теру, какую ячейку памяти использовать. В простейшей форме можно прямо указывать имя ячейки, например ADD AX,ANADDRESS, где ANADDRESS ранее определенная ячейка.
Для эффективного программирования требуется использовать несколь ко способов именования ячеек памяти. В ассемблерном операторе для определения адреса можно объединять 4 возможных элемента. Вычисленный, или эффективный адрес, объединяется с соответствующим сегментным регистром, давая окончательный адрес. Вот эти элементы:
1. База. Это содержимое одного из регистров общего назначения. База считается начальной точкой, а другие элементы прибавляются к ней с образованием эффективного адреса. В регистр можно поместить начальную ячейку массива данных.
2. Смещение. Это адрес ячейки в сегменте памяти. Длина смещения 8,
16 или 32 бита.
3. Индекс. Как и в базовой адресации, для образования эффективного
адреса используется содержимое какого-либо регистра. В случае 16-битных операндов для индексирования предназначены SI и DI, а в случае 32-битных операндов любой регистр, кроме ESP.
4. Масштаб. Если индекс является 32-битной величиной, его можно
умножить на 2, 4 или 8. Это удобно при обращении к массивам с элементами фиксированного размера. Эффективный адрес вычисляется следующим образом:
ЕА = База + (Индекс * Масштаб) + Смещение
При отсутствии некоторых элементов формула упрощается. Если, на-
пример, нет индекса, то ЕА = База + Смещение. Ниже приведены примеры использования каждого режима.
1. Прямая адресация включает регистровые и непосредственные операнды; обращение к памяти не требуется.
ЛЕКЦИЯ 5 АДРЕСАЦИЯ ПАМЯТИ
1.Режимы адресации.
Языки программирования. Ассемблер. Конспект лекций -39-
2. Используется только смещение. Смещение обычно указывается мет-
кой; вычисляется расстояние от текущей команды до метки и используется
как смещение при обращении к памяти.
3. В косвенной адресации адресом служит содержимое регистра. Имя
регистра заключается в квадратные скобки. Например, команда MOV АХ,
ВХ передает в АХ содержимое ВХ, а команда MOV АХ,[ВХ] передает в АХ
содержимое ячейки памяти, адресуемой содержимым регистра ВХ.
4. Базовая адресация требует прибавить константу к значению в реги-
стре и использовать сумму как эффективный адрес. Выражение «регистр +
смещение» заключается в квадратные скобки. Например, в команде MOV
АХ,[ВХ+4] сумма содержимого ВХ и 4 служит эффективным адресом. Зна-
чение, содержащееся по данному адресу, передается в АХ.
В остальных режимах используется индексирование. Индекс заключа-
ется в квадратные скобки и помещается после базы, с которой он суммирует-
ся. Масштабировать (умножать на 2, 4 или 8) можно только индексы.
5. В индексной адресации эффективный адрес равен сумме прямого ад-
реса и индекса. В команде MOV ECX,TABLE[SI] эффективный адрес равен
сумме SI и значения TABLE. Число, хранящееся по эффективному адресу,
передается в ЕСХ.
6. Индекс объединяет базу в регистре и индекс в регистре. В команде
MOV ECX,[EDX][EAX] эффективный адрес равен сумме EDX и ЕАХ. В слу-
чае 32-битных операндов индекс можно масштабировать.
7. Масштабированный индекс можно умножать на 2, 4 или 8. Напри-
мер, в команде ADD ЕСХ, TABLE [ESI*8] значение из ESI умножается на 8,
суммируется с адресом TABLE и результат служит эффективным адресом.
Такой прием особенно удобен для элементов данных длиной в 8 байт.
Кроме приведенных режимов можно использовать любую комбинацию
базы, индекса (с масштабированием или нет) и смещения. Вычисление адреса
ведется параллельно с другими действиями, поэтому даже в случае самого
сложного режима адресации дополнительное время не требуется. Но есть од-
но исключение: при наличии базы, индекса и смещения время увеличивается
на один такт.
2. Сегментация памяти в процессоре х86.
В процессоре х86 сегментация памяти реализована довольно простыми
средствами. Под сегментом понимается блок смежных ячеек п амяти ( в а д-
ресном пространстве 1 Мбайт) с максимальным размером 64 Кбайт и началь-
ным или базовым адресом, находящимся на 16-байтной границе (такая гра-
ница называется параграфом). Для обращения к памяти необходимо опреде-
лить базу сегмента и 16-битное расстояние от базы, называемое смещением
(offset) или относительным адресом. Базовые адреса четырех одновременно
доступных программе сегментов находятся в сегментных регистрах кода CS,
данных DS, стека SS и дополнительных данных ES. Каждый из них имеет
длину 16 бит, но можно считать сегментный регистр 20-битным, так как че-
ЛЕКЦИЯ 5 АДРЕСАЦИЯ ПАМЯТИ
2. Сегментация памяти в процессоре х86.
Языки программирования. Ассемблер. Конспект лекций -40-
тыре младших бита базового адреса содержат нули. Таким образом, две 16-
битных величины (указателя), соответствующие базовому адресу сегмента (с
подразумеваемыми младшими нулями) и смещению, позволяют обращаться
ко всему адресному пространству 1 Мбайт, как показано на рис. 5.1.
Рис. 5.1. Сегментация памяти в процессоре х86
Отметим, что сегментные регистры содержат физические адреса памя-
ти, т. е. значение в каждом сегментном регистре прямо указывает на границу
параграфа в адресном пространстве 1 Мбайт. В защищенном режиме после-
дующих процессоров значение в сегментном регистре не имеет прямой взаи-
мосвязи с реальным адресом памяти.
Чтобы упростить обращения к памяти, за каждой командой закреплен
сегментный регистр по умолчанию, который привлекается без специальных
указаний. Так, команды всегда выбираются из сегмента кода (указателями
служат регистры CS и IP), все стековые операции выполняются в сегменте
стека (SS:SP), данные (переменные) находятся в сегменте данных (база нахо-
дится в регистре DS, а смещение, называемое эффективным адресом ЕА, оп-
ределяется режимом адресации). Для обращения к другим сегментам перед
командой помещается префикс замены сегмента. Например, команда MOV
АХ,[100Н] загружает в регистр АХ слово из сегмента, базовый адрес которо-
го находится в регистре DS, а смещение равно 100Н. Команда с префиксом
замены сегмента MOV AX,ES:[100H] будет обращаться к дополнительному
сегменту данных, базовый адрес которого находится в регистре ES.
Преобразование пары сегмент:смещение, называемой также логиче-
ским или виртуальным адресом, в физический адрес осуществляется доволь-
но просто: содержимое сегментного регистра сдвигается влево на четыре би-
та (что эквивалентно умножению на 16), а затем суммируется со смещением.
Если, например, регистр DS содержит 1234Н, а регистр SI содержит 5678Н,
то физический адрес в команде MOV AX,[SI] следующий:
ЛЕКЦИЯ 5 АДРЕСАЦИЯ ПАМЯТИ
2. Сегментация памяти в процессоре х86.
Языки программирования. Ассемблер. Конспект лекций -41-
(DS) * 16 + (SI) = 12340Н + 5678Н = I79B8H.
Отметим два обстоятельства, связанные с сегментацией памяти в про-
цессоре х86. Во-первых, преобразование логического адреса в физический
всегда однозначно, т. е. каждому логическому адресу соответствует уникаль-
ный физический адрес. Однако обратное преобразование неоднозначно: каж-
дому физическому адресу соответствуют 4К логических адресов. Поэтому во
всех процессорах фирмы Intel манипуляции физическими адресами осущест-
вляются довольно сложно. Во-вторых, в этом способе формирования физиче-
ского адреса может возникнуть своеобразное переполнение. Пусть, например,
регистр DS содержит 0FFFFH, тогда в команде MOV АХ,[3000Н] физический адрес
(DS) * 16 + 3000Н = 0FFFF0H + 3000Н = 102FF0H.
В такой ситуации процессор просто отбрасывает старший 21-й бит ад-
реса и выдает на шину адрес 02FF0H. Другими словами, здесь троисходит
так называемое «заворачивание» или «закругление» (wrap around) адреса: от
адреса 0FFFFFH происходит переход к нулевому адресу. Заворачивание ад-
реса приходится учитывать при работе процессора х86 в R- и V-режимах.
Простая сегментация памяти в процессоре 8086 обладает следующими
особенностями, которые в известном смысле можно считать ее недостатками,
усложняющими разработки мультизадачных систем.
1. Сегменты памяти, определяемые только одними сегментными реги-
страми, имеют всего два атрибута: начальный адрес, находящийся на границе
параграфа, и максимальный размер 64 Кбайт. Никаких аппаратных средств
контроля правильности использования сегментов нет.
2. Размещение сегментов в памяти произвольно: сегменты могут час-
тично или полностью перекрываться или не иметь общих частей.
3. Программа может обращаться к любому сегменту для производства
как считывания, так и записи данных, а также для выборки команд. В более
общем плане программа может обратиться по любому физическому адресу, а
для защиты определенных областей памяти от несанкционированного досту-
па требуются внешние схемы.
4. Нет никаких препятствий для обращения даже к физически несуще-
ствующей памяти. Когда программа выдает адрес несуществующей памяти,
результат зависит только от особенностей схем дешифрирования адреса и
управления внешней шиной: процессор может получить фиктивные данные,
будет сформирован сигнал прерывания или система может просто зависнуть
в ожидании данных, которые никогда не будут возвращены.
С учетом этих недостатков сегментация памяти сначала в процессоре
80286, а затем и в процессорах 80386 и i486 была значительно усовершенст-
вована. В этих процессорах имеются гибкие средства организации сегментов
с большим числом атрибутов и эффективные механизмы контроля и защиты
доступа к сегментам. Кроме того, «ниже» сегментации действует внутренний
механизм страничной организации памяти, который позволяет еще более
гибко управлять ресурсами памяти компьютера.
ЛЕКЦИЯ 5 АДРЕСАЦИЯ ПАМЯТИ
Языки программирования. Ассемблер. Конспект лекций -42-
3. Система команд.
Команды группируются по выполняемым функциям. Кратко опишем
каждую команду и общие правила ее применения.
Очень важным для команд является понятие операнда. Это то значение
данных, которое «обрабатывает» команда. Хотя каждая команда имеет свою
структуру операндов, но имеется и много общих особенностей.
Операнд обычно рассматривается как источник или получатель (в зави-
симости от того, берет команда данные или помещает данные в него). Полу-
чателями могут быть только регистры или ячейки памяти, а источниками
еще и непосредственные данные. Одновременно и источником, и получате-
лем ячейки памяти быть не могут.
Обычно операнды могут иметь любой размер (байт, слово или двойное
слово). В большинстве команд с несколькими операндами все операнды
имеют одинаковый размер.
Команды передачи данных. Команды этой группы пересылают данные
из одного места компьютера в другое: между регистрами, между регистрами
и памятью, между регистром или памятью и стеком.
MOV пересылает один элемент данных из одного места в другое.
XCHG обменивает содержимое двух регистров или содержимое ре-
гистра и ячейки памяти. Часто применяется для синхронизации нескольких
процессов, так как ее нельзя прерывать другим устройством, использующим
шину данных.
PUSH копирует операнд-источник в вершину стека. Применяется
для помещения параметров в стек перед вызовом процедуры. Полезна также
для временного сохранения данных в стеке.
POP берет верхний элемент из стека и пересылает его в операнд-
получатель. Применяется для возвращения из стека значений, включенных в
него командой PUSH.
PUSHA и PUSHAD применяются для помещения содержимого всех
8 регистров общего назначения в стек (PUSHA оперирует 16-битными ре-
гистрами, PUSHAD 32-битными регистрами). Эти команды используются
перед вызовом процедур.
РОРА и POPAD восстанавливают из стека содержимое 8 регистров
общего назначения, являясь дополнением команд PUSHA и PUSHAD.
Арифметические команды. Эти команды применяются для выполне-
ния арифметических операций над знаковыми или беззнаковыми числами.
Они часто встречаются в программах.
ADD суммирует два операнда, помещая результат в первый операнд
(получатель).
SUB вычитает один операнд (источник) из другого (получатель).
Разность замещает место получателя.
INC увеличивает операнд на 1, не воздействуя на флажок переноса.
Применяется в циклах для инкремента индекса.
ЛЕКЦИЯ 5 АДРЕСАЦИЯ ПАМЯТИ
3. Система команд.
Языки программирования. Ассемблер. Конспект лекций -43-
DEC уменьшает операнд на 1, не воздействуя на флажок переноса.
Применяется в циклах для декремента индекса.
MULэта простая команда умножает беззнаковые целые числа. Она
имеет один операнд-источник. Еще два операнда умножения подразумевают-
ся размером операнда-источника.
IMUL умножает знаковые целые числа. Это более гибкая и сложная
команда. Она имеет 4 базовые формы по числу и типу операндов (один, два
или три операнда).
DIV осуществляет деление целых беззнаковых чисел. В делении
есть фактически 4 операнда: делимое, делитель, частное и остаток. Опреде-
ляется только местоположение делителя. Все остальные операнды определя-
ются неявно, в зависимости от размера делителя.
IDIV аналогична команде DIV, но работает со знаковыми числами.
NEG изменяет знак операнда, находящегося в регистре или памяти.
СМР аналогична команде SUB, но не сохраняет результат. Команда
сравнивает два числа для последующего условного перехода.
ADC действует как команда ADD, но прибавляет значение переноса
к сумме. Удобна для арифметики повышенной точности.
SBB действует как команда SUB, но вычитает из разности значение
переноса. Удобна для арифметики повышенной точности.
Команды преобразования данных. Команды этой группы применяются
для преобразования типов данных. Большинство из них работает со знако-
выми числами, а одна пригодна и для беззнаковых чисел.
MOVSX команда пересылки с расширением знака, передает опе-
ранд-источник в получатель, расширяя знаковый бит источника в старшую
часть получателя.
MOVZX аналогична предыдущей команде, но старшая часть полу-
чателя устанавливается равной нулю.
CBW команда преобразования байта в слово, имеет источником ре-
гистр AL, а получателем регистр АН, действует аналогично команде
MOVSX. Знаковый бит AL расширяется в АН, преобразуя знаковый байт из
AL в знаковое слово в АХ.
CWDE преобразует знаковое слово из АХ в знаковое двойное слово
в ЕАХ, расширяя знаковый бит АХ в старшую половину ЕАХ.
CWD также преобразует знаковое слово в знаковое двойное слово,
но результат, в отличие от команды CWDE помещается в два регистра. Зна-
ковый бит из АХ расширяется в регистр DX.
CDQ эта команда заполняет регистр EDX знаковым битом регистра
ЕАХ.
Команды десятичной арифметики. Прямой поддержки десятичной
арифметики процессор не обеспечивает, но имеет команды десятичной кор-
рекции, действующие с обычными арифметическими командами. Есть два
типа команд десятичной коррекции: команды ASCII-коррекции работают с
одной цифрой в байте, а команды десятичной коррекции с двумя цифра-
ми.
ЛЕКЦИЯ 5 АДРЕСАЦИЯ ПАМЯТИ
3. Система команд.
Языки программирования. Ассемблер. Конспект лекций -44-
ААА, AAS, AAM, AAD команды ASCII-коррекции для арифметиче-
ских операций. Три из них применяются после обычной арифметической ко-
манды, корректируя полученный результат: ААА после сложения, AAS
после вычитания и ААМ после умножения. Команда AAD коррекции
деления, выполняется до операции и подготавливает операнды к делению.
DAA, DAS команды десятичной коррекции для сложения и вычита-
ния, применяются аналогично предыдущим.
Логические команды. Команды этой группы применяются для произ-
водства булевых операций и обеспечивают работу с двоичными полями в
байтах, словах и двойных словах.
AND выполняет логическую функцию И для двух операндов и
удобна для установки двоичного поля в нуль.
OR выполняет логическую функцию ИЛИ для двух операндов.
Обычно применяется для установки двоичного поля в нужное состояние (по-
ле предварительно очищается командой AND).
NOT инвертирует биты своего операнда.
TEST команда логического сравнения аналогична команде AND, но
результат не сохраняется. Применяется для проверки двоичного поля на нуль
(или не нуль).
XOR выполняет логическую функцию ИСКЛЮЧАЮЩЕГО ИЛИ
для двух операндов. Применяется для инвертирования в двоичном поле толь-
ко определенных бит.
SETxx эти команды применяются для сохранения результата неко-
торого сравнения. Значение «хх» определяет условие сравнения. Если срав-
нение истинно, то получатель устанавливается в 1, а если сравнение ложно,
получатель устанавливается на 0.
Команды сдвига и циклического сдвига. Эти команды позволяют пе-
редвигать биты внутри любого из стандартных типов данных. Они применя-
ются для ускорения операций умножения и деления целых чисел и образова-
ния двоичных полей.
SHR, SHL команды логических сдвигов «вдвигают» нули с одного
конца операндов, а биты с другого конца «выдвигаются».
SAR, SAL команды арифметического сдвига. Арифметический
сдвиг влево аналогичен логическому сдвигу, а при арифметическом сдвиге
вправо происходит копирование знакового бита. Это удобно для деления
знаковых чисел на степени числа 2.
ROR, ROL при циклическом сдвиге биты данных не теряются: вы-
двигаемый бит помещается на место освобождающегося (вдвигаемого).
RCL, RCR это команды циклического сдвига, включающего пере-
нос. Выдвигаемый бит операнда помещается во флажок переноса, а старое
значение флажка переноса передается в освобождающийся бит. Обычно
применяются в операциях повышенной (кратной) точности.
SHRD, SHLD это команды сдвигов двойной точности, но их дейст-
вие отличается от команд циклического сдвига, включающих перенос. Эти
команды имеют три операнда: источник, получатель и счетчик сдвигов. По-
ЛЕКЦИЯ 5 АДРЕСАЦИЯ ПАМЯТИ
3. Система команд.
Языки программирования. Ассемблер. Конспект лекций -45-
лучатель сдвигается, и выдвигаемые биты теряются, а освобождающиеся би-
ты заполняются битами из источника.
Команды операций над битами. Команды этой группы очень удобны
для манипуляций отдельными битами, допуская их установку и проверку.
ВТ, BTS, BTR, ВТС. Команда проверки бита ВТ просто помещает зна-
чение указанного бита во флажок переноса. Три другие команды выполняют
эту же функцию, но позволяют адресуемый бит установить в 1 (BTS), сбро-
сить в 0 (BTR) или инвертировать (ВТС).
BSF, BSR две команды сканирования бита: BSF (вперед) и BSR (на-
зад) находят первую 1 в операнде, начиная с младшего бита (BSF) или
старшего бита (BSR). Обе команды удобны при работе с двоичными образ-
ами. Команда BSR применяется также при вычислении двоичных логарифмов.
Команды управления флажками. Команды этой группы позволяют
проверять и изменять флажки процессора. Одни команды работают с отдель-
ными флажками, другие со всеми одновременно.
На отдельные флажки воздействуют 7 команд. Команды CLD и STD
сбрасывают и устанавливают флажок направления. Команды CLI и STI сбра-
сывают и устанавливают флажок направления. Команды CLC и СТС сбрасы-
вают и устанавливают флажок переноса, а команда CMC инвертирует его.
Команда LAHF загружает младший байт флажков в регистр АН. Ко-
манда SAHF производит обратную передачу. Команды PUSHF и PUSFD
включают регистры Flags и EFlags в стек. Соответствующие операции извле-
чения из стека реализуют команды POPF и FOPFD.
Циклические команды. Часто приходится обрабатывать большие бло-
ки данных, и в этом помогают команды данной группы. Одна циклическая
команда может реализовать цикл, требующий обычно нескольких команд.
Каждая из этих команд обычно выполняет одну операцию пересылки,
сравнения, загрузки, запоминания или сканирования. Для адресации источника
применяется регистр (E)SI, а получателя регистр (T)DI. После команды оба
регистра модифицируются для адресации следующего элемента цикла. Данные
команды наиболее полезны при использовании с одним из префиксов повторе-
ния.
REP, REPE, REPZ, REPNE, REPNZ префиксы повторения, обеспечи-
вают выполнение следующей за ними команды заданное число раз. Префикс
повторения REP вызывает выполнение команды столько раз, сколько опре-
делено содержимым регистра ЕСХ. Аналогичные префиксы REPE и REPZ
вызывают повторение команды либо до исчерпания счетчика, либо до уста-
новки флажка Z в нуль. Префиксы REPNE и REPNZ действуют аналогично
REPE, но выход происходит при установке флажка Z в 1.
MOVS эта команда просто пересылает фрагмент данных из одной
области памяти в другую. Необходимо тщательно проанализировать возмож-
ность перекрытия фрагментов и соответственно определить состояние флаж-
ка направления.
CMPS сравнивает два фрагмента (массива данных). Для окончания
сравнения в нужной точке применяются префиксы REPE или REPNE.
ЛЕКЦИЯ 5 АДРЕСАЦИЯ ПАМЯТИ
3. Система команд.
Языки программирования. Ассемблер. Конспект лекций -46-
STOS полезна для заполнения фрагмента константой. Она передает со-
держимое соответствующей части регистра ЕАХ в каждый элемент фрагмента.
SCAS сравнивает каждый элемент данных с частью регистра ЕАХ.
Обычно с этой командой применяется префикс REPE или REPNE.
LODS эта команда необычна в том, что она бесполезна с префик-
сом повторения. Она просто загружает следующий элемент данных в некото-
рую часть ЕАХ. Следующий пример показывает общие принципы группы
циклических команд.
Команды управления программой. При создании программ часто при-
ходится изменять последовательный ход исполнения команд. Команды дан-
ной группы обеспечивают необходимые средства управления ходом выпол-
нения программы.
JMP команда безусловного перехода. Обычно в ней указывается
метка, определяющая следующую выполняемую команду. Ассемблер фор-
мирует нужную форму JMP, зная местонахождение именованного (отмечен-
ного) оператора.
Jxx команда условного перехода, в которой хх означает код прове-
ряемого условия. Обычно перед ней находится команда сравнений или дру-
гая команда, которая устанавливает некоторые флажки.
CALL команда вызова. Применяется для реализации процедур (на-
зываемых еще подпрограммами и функциями). Команда вызова передает
управление так же, как команда JMP. Однако до ее выполнения в стек вклю-
чается необходимая информация, чтобы вызванная процедура могла возвра-
тить управление команде, находящейся после команды CALL. Для выполне-
ния возврата управления применяется команда RET.
LOOP, LOOPE, LOOPZ, LOOPNE, LOOPNZ команды зацикливания.
Помогают в реализации программных циклов. Команда LOOP повторяет
цикл такое число раз, которое определяется содержимым регистра ЕСХ. В
командах LOOPE и LOOPZ имеется дополнительное ограничение: цикл за-
канчивается, когда флажок Z будет нулевым. Команды LOOPNE и LOOPNZ
аналогичны предыдущим, но цикл заканчивается, когда флажок Z будет содер-
жать 1.
INT, INTO, IRET, IRETD последняя группа команд передачи управ-
ления. Связана с прерыванием. Команда INT инициирует выполнение сис-
темной процедуры. Команда INTO вызывает процедуру прерывания 4, если
установлен флажок переполнения. Обычно процедуры обработки прерыва-
ний входят в операционную систему. Возврат в вызывающую программу
осуществляет одна из команд возврата из прерывания IRET или IRETD.
Команды поддержки языка высокого уровня. Обычно команды этой
группы генерируются компиляторами, а программисты на ассемблере их не
применяют. Такие команды упрощают разработку компиляторов и обеспечи-
вают аппаратную поддержку некоторых общих операций.
BOUND применяется для контроля границ массива. Операндами
служат значение, нижняя граница и верхняя граница. Если значение не нахо-
дится внутри границ, возникает прерывание.
ЛЕКЦИЯ 5 АДРЕСАЦИЯ ПАМЯТИ
3. Система команд.
Языки программирования. Ассемблер. Конспект лекций__