Максимов Н.В., Партыка Т.Л., Попов И.И. Архитектура ЭВМ и вычислительных систем (2005) (1186253), страница 75
Текст из файла (страница 75)
Элементы такихстрок располагаются в последовательных ячейках памяти, но каждый элемент представлен в «перевернутом» виде.Представление адресов. Адрес — это порядковый номер ячейкипамяти, т. е. неотрицательное целое число, поэтому в общем случаеадреса представляются так же, как и числа без знака. Однако в180X86 есть ряд особенностей в представлении адресов.Дело в том, что в 180X86 термином «адрес» обозначают разныепонятия.
Часто под адресом понимается 16-битовое смещение(offset) — адрес ячейки, отсчитанный от начала сегмента (области)памяти, которому принадлежит эта ячейка. В этом случае под адресотводится слово памяти, причем адрес записывается в «перевернутом» виде (как и числа-слова вообще).В другом случае под «адресом» понимается 20-битовый абсолютный адрес некоторой ячейки памяти. В силу ряда причин в180X86 такой адрес задается не как 20-битовое число, а как пара«сегментхмещение», где «сегмент» (segment) — это первые 16 битовначального адреса сегмента памяти, которому принадлежит ячейка,а «смещение» (offset) — 16-битовый адрес этой ячейки, отсчитанныйот начала данного сегмента памяти (величина 16 х сегмент + смещение дает абсолютный адрес ячейки).Такая пара записывается в виде двойного слова, причем (как идля чисел) в «перевернутом» виде: в первом слове размещается смещение, а во втором — сегмент, причем каждое из этих слов в своюочередь представлено в «перевернутом» виде.
Например, параl 2 3 4 h : 5678h будет записана так:78Смещение561234Сегмент384Глава 4. Персональные компьютерыДирективы определения данных. Для того чтобы в программе наMASM зарезервировать ячейки памяти под константы и переменные, необходимо воспользоваться директивами определения данных — с названиями DE (описывает данные размером в байт), DW(размером в слово) и DD (размером в двойное слово). (Директивы,или команды ассемблеру, — это предложения программы, которыми ее автор сообщает какую-то информацию ассемблеру или проситчто-то сделать дополнительно, помимо перевода символьных команд на машинный язык.)В простейшем случае в директиве DB, DW или DD описываетсяодна константа, которой дается имя для последующих ссылок нанее. По этой директиве ассемблер формирует машинное представление константы (в частности, если надо, «переворачивает» ее) и записывает в очередную ячейку памяти.
Адрес этой ячейки становится значением имени: все вхождения имени в программу ассемблербудет заменять на этот адрес.Имена, указанные в директивах DB, DW и DD, называются именами переменных (в отличие от меток — имен команд).В MASM числа записываются в нормальном (неперевернутом)виде в системах счисления с основанием 10, 16, 8 или 2. Десятичные числа записываются как обычно, за шестнадцатеричным числом ставится буква h (если число начинается с «цифры» А, в, ., F,то вначале обязателен 0), за восьмеричным числом — буква q или о,за двоичным числом — буква Ь.Примеры:AВСDЕDBDBDWDWDD162OA2h-1OFFFFh-1;описать константу-байт 162 и дать ей имя А/такая же константа, но с именем В;константа-слово -1 с именем С/такая же константа-слово, но с именем D;-1 как двойное словоКонстанты-символы описываются в директиве DB двояко: указывается либо код символа (целое от 0 до 255), либо сам символ вкавычках (одинарных или двойных); в последнем случае ассемблерсам заменит символ на его код.
Например, следующие директивыэквивалентны (2А — код звездочки в ASCII):СН DB 02AhСН DB '*'СН DB «*»4.3. Режимы процессора. Система команд процессоров 180x86...385Константы-адреса, как правило, задаются именами. Так, по директивеADR DW СНбудет отведено слово памяти, которому дается имя ADR и в котороезапишется адрес (смещение), соответствующий имени сн. Если такое же имя описать в директиве DD, то ассемблер автоматически добавит к смещению имени его сегмент и запишет смещение в первуюполовину двойного слова, а сегмент — во вторую половину.По любой из директив DB, DW и DD можно описать переменную,т. е.
отвести ячейку, не дав ей начального значения. В этом случае вправой части директивы указывается вопросительный знак:F DW ? ; отвести слово и дать ему имя F, ничего в этослово не записывать .В одной директиве можно описать сразу несколько константи/или переменных одного и того же размера, для чего их надо перечислить через запятую. Они размещаются в соседних ячейках памяти. Пример:G DB 2 0 0 ,-5,10h,'F1Имя, указанное в директиве, считается именующим первую изконстант.Для ссылок на остальные в MASM используются выражениявида <имя> + <целое>; например, для доступа к байту с числом -5надо указать выражение G + 1, для доступа к байту с 10h — выражение G + 2 и т.
д.Если в директиве DB перечислены только символы, например:S DB ' а ' , ' + ' ' b 'тогда эту директиву можно записать короче, заключив все эти символы в одни кавычки:S DB ' а + Ь 'И наконец, если в директиве описывается несколько одинаковых констант (переменных), то можно воспользоваться конструкцией повторенияk DUP(a,b, . . . ,с) ,которая эквивалентна повторенной k раз последовательности а,Ь, ..., с.113 <Архитсктура ЭВМ»386Глава 4. Персональные компьютерыНапример, директивыVI DB 0 , 0 , 0 , 0 , 0V2 DW ? , ? , ? , ? . ? , ? , ? , ? . ? , ' а ' , 1 , 2 , 1 , 2 , 1 , 2 , 1 , 2можно записать более коротко таким образом:VI DB 5 D U P ( O )V2 DW 9 D U P ( ? ) ,' a 1 , 4 DUP(1,2)Представление команд. Модификация адресовС т р у к т у р а к о м а н д .
И с п о л н и т е л ь н ы е а д р е с а . Машинные команды 180X86 занимают от 1 до 6 байтов. Код операции(КОП) занимает один или два первых байта команды. В 180X86много различных операций, так что для них не хватает 256 различных КОПов, которые можно представить в одном байте. Поэтомунекоторые операции объединяются в группу и им дается один и тотже КОП, во втором же байте этот КОП уточняется.
Кроме того, вовтором байте указываются типы и способ адресации операндов. Остальные байты команды указывают на операнды.Команды могут иметь от 0 до трех операндов, у большинствакоманд — один или два операнда. Размер операндов — байт илислово (редко — двойное слово). Операнд может быть указан в самойкоманде (это так называемый непосредственный операнд), либо может находиться в одном из регистров 180X86 и тогда в команде указывается этот регистр, либо может находиться в ячейке памяти и тогда в команде тем или иным способом указывается адрес этой ячейки. Некоторые команды требуют, чтобы операнд находился нафиксированном месте (например, в регистре АХ), тогда этот операндявно не указывается в команде.
Результат выполнения команды помещается в регистр или ячейку памяти, из которого (которой), какправило, берется первый операнд. Например, большинство командс двумя операндами реализуют действиеор! := ор! - ор2где opl — регистр или ячейка; а ор2 — непосредственный операнд,регистр или ячейка.Адрес операнда разрешено модифицировать по одному илидвум регистрам. В первом случае в качестве регистра-модификатораразрешено использовать регистр вх, ВР, si или DI (и никакойиной). Во втором случае один из модификаторов обязан быть регистром вх или ВР, а другой — регистром SI или DI; одновременнаямодификация по вх и ВР или si и DI недопустима.4.3. Режимы процессора.
Система команд процессоров 180x86...387Регистры вх и ВР обычно используются для хранения базы (начального адреса) некоторого участка памяти (скажем, массива) ипотому называются базовыми регистрами, а регистры si и DI частосодержат индексы элементов массива и потому называются индексными регистрами.Однако такое распределение ролей необязательно, и, например,в si может находиться база массива, а в вх — индекс элементамассива.В MASM адреса в командах записываются в виде одной из следующих конструкции:А , А [ М ] или A [ M l ] [ M 2 ] ,где А — адрес; м — регистр вх, ВР, si или DI, Ml — регистр вх илиВР, а М2 — регистр si или DI.
Во втором и третьем варианте А может отсутствовать, в этом случае считается, что А = 0.При выполнении команды процессор прежде всего вычисляеттак называемый исполнительный (эффективный) адрес — как суммуадреса, заданного в команде, и текущих значений указанных регистров-модификаторов, причем все эти величины рассматриваются какнеотрицательные и суммирование ведется по модулю 2 16 ( [ г ] означает содержимое регистра г):А : Аисп = АА [ М ] : Аисп = А+[М](mod 2 1 6 )А [ М 1 ] [ М 2 ] : Аисп = А + [ М 1 ] + [ М 2 ](mod 2 1 6 )Полученный таким образом 16-разрядный адрес определяет такназываемое смещение — адрес, отсчитанный от начала некоторогосегмента памяти. Перед обращением к памяти процессор еще добавляет к смещению начальный адрес этого сегмента (он хранится внекотором сегментном регистре), в результате чего получаетсяокончательный 20-разрядный адрес, по которому и происходит фактическое обращение к памяти.Ф о р м а т ы к о м а н д .
В 180X86 форматы машинных команддостаточно разнообразны. Для примера приведем лишь основныеформаты команд с двумя операндами.1. Формат «регистр—регистр» (2 байта):копdw11reglreg27 210765 32 0388Глава 4. Персональные компьютерыКоманды этого формата описывают обычно действие regl : =regl - reg2 или reg2 := reg2 - regl. Поле КОП первого байтауказывает на операцию (-), которую надо выполнить.Бит w определяет размер операндов, а бит d указывает, в какойиз регистров записывается результат:W = 1— словаd = 1regl := regl - reg2= 0— байты= 0reg2 := reg2 - reglВо втором байте два левых бита фиксированы (для данногоформата), а трехбитовые поля regl и reg2 указывают на регистры,участвующие в операции, согласно следующим правилам:regw=lw=0000AXAL001CXCL010DXDLOilBXBL100SPAH101BPCH110SIDH111DIBH2. Формат «регистр—память» (2—4 байта):копwmodregmemадрес ( 0 - 2 байта)Эти команды описывают операции reg := reg - mem илиmem : = mem - reg.
Бит w первого байта определяет размер операндов (см. ранее), а бит d указывает, куда записывается результат: врегистр (d = 1) или в ячейку памяти (d = 0). Трехбитовое поле regвторого байта указывает операнд-регистр (см. выше), двухбитовоеполе mod определяет, сколько байт в команде занимает операнд-адрес (00 — 0 байтов, 01 — 1 байт, 10 — 2 байта), а трехбитовое полеmem указывает способ модификации этого адреса. В следующей таб-4.3.