В.Г. Баула - Введение в архитектуру ЭВМ и системы программирования, страница 9
Описание файла
Документ из архива "В.Г. Баула - Введение в архитектуру ЭВМ и системы программирования", который расположен в категории "". Всё это находится в предмете "архитектура эвм" из 2 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Онлайн просмотр документа "В.Г. Баула - Введение в архитектуру ЭВМ и системы программирования"
Текст 9 страницы из документа "В.Г. Баула - Введение в архитектуру ЭВМ и системы программирования"
<R1> := <R1> <R2> при d = 0
<R2> := <R2> <R1> при d = 1.
Бит w задаёт размер регистров-операндов, имена которых можно определить по следующей схеме:
R1,2 | w = 1 | w = 0 |
000 | AX | AL |
001 | CX | CL |
010 | DX | DL |
011 | BX | BL |
100 | SP | AH |
101 | BP | CH |
110 | SI | DH |
111 | DI | BH |
В младших моделях ЭВМ нашего семейства в таком формате возможна работа лишь с упомянутыми в таблице регистрами. В последующих же моделях возможности этого формата были расширены, но за счёт увеличения длины команды. Мы будем пользоваться и другими видами формата регистр-регистр, например, командой mov ds,ax, но выписывать их внутреннее представление не будем.
Как видно из таблицы, архитектурой не предусмотрены операции формата r8–r16, т.е. операции над регистрами разной длины запрещены, например, команды типа add AL,BX являются некорректными. Поэтому появляется необходимость преобразования типов из короткого целого в длинное, и из длинного в сверхдлинное. Такое преобразование зависит от трактовки числа – знаковое или беззнаковое. В первом случае число всегда расширяется слева нулями, а во втором – размножается знаковый бит (для знаковых чисел незначащими двоичными цифрами будут 0 для неотрицательных и 1 для отрицательных значений). Для этого в языке машины предусмотрены безадресные команды, имеющие а Ассемблере такую мнемонику:
cbw (convert byte to word)
и
cwd (convert word to double),
которые производят знаковое расширение соответственно регистра AL до AX и AX до пары регистров <DX,AX>, которые в этом случае рассматриваются как один длинный 32 битный регистр.
Преобразование целого значения из более длинного формата в более короткий (усечение) производится путём отбрасывания соответствующего числа левых битов целого числа. Усечённое число получится правильным, если будут отброшены только незначащие биты. Для беззнаковых чисел это всегда нулевые биты, а для знаковых – биты, совпадающие со знаковым битом усечённого числа.
-
Формат регистр–память (и память-регистр).
КОП | R1 | A2 |
Операнд A2 может иметь один из приведённых ниже трёх видов:
-
A2 = A,
-
A2 = A[M1],
-
A2 = A[M1][M2].
Здесь A – задаваемое в команде смещение длиной 1 или 2 байта (заметим, что нулевой смещение может и не занимать места в команде), M1 и M2 – так называемые регистры-модификаторы. Как мы сейчас увидим, значение адреса второго операнда A2 будет вычисляться по определённым правилам, поэтому этот адрес часто называют исполнительным адресом.
Стоит отметить один факт. До сих пор адресом мы называли физический номер ячейки в памяти машины. В языке Ассемблера адресом принято называть смещение ячейки относительно начала того сегмента, в котором она находится. Для обозначения полного адреса будем употреблять термин физический адрес.
Рассмотрим подробнее каждый их трёх возможных видов операнда A2. При A2 = A физический адрес вычисляется центральным процессором по формуле:
Aфиз := (B*16 + A)mod 220,
где B, как обычно, обозначает значение одного из сегментных регистров. Запись A2 = A[M1] означает использование регистра-модификатора, которым может быть любой из следующих регистров: BP, BX, SI, DI. В этом случае физический адрес вычисляется по формуле
Aфиз := (B*16 + (A + <M1>)mod 216)mod 220,
где вместо <M1> подставляется содержимое регистра-модификатора (одного из четырёх указанных). Запись A2 = A[M1][M2] 1 обозначает вычисление физического адреса по формуле:
Aфиз := (B*16 + (A + <M1> + <M2>)mod 216)mod 220,
где используются сразу два регистра-модификатора. На месте M1 можно указывать любой из регистров BX или BP, а на месте M2 – любой из регистров SI или DI. Использование, например, регистров BX и BP (как и SI и DI) одновременно в качестве модификаторов запрещено. В старших моделях почти все ограничения на использование регистров модификаторов также было снято (за счёт увеличения длины команды).
В качестве примера вычислим физический адрес второго операнда команды сложения формата RX, на языке Ассемблера эту команду можно записать в виде add ax,6[bx][di]. Пусть регистры имеют следующие значения (в шестнадцатеричном виде перед числом записывается ноль, если оно начинается с цифр A–F):
bx = 0FA00h, di = 0880h, ds = 2000h
Тогда
Aфиз := (2000h*16 + (6 + 0FA00h + 0880h)mod 216)mod 220 =
(20000h + 0286)mod 220 = 20286h
Если, например, в байте с адресом 20286h хранится число 56h, а в байте с адресом 20287h – число 32h, то наша команда реализует операцию сложения ax:=ax+3256h.
Рассмотрим теперь внутреннее представление формата команды регистр–память. Длина этой команды 2, 3 или 4 байт:
8 бит | 2 бита | 3 бита | 3 бита | 8 бит | 8 бит | ||
КОП | d | W | Mod | R1 | Mem | a8 | a8->a16 |
где mod – трёх битовое поле модификатора, mem – двух битовое поле способа адресации, a8 и a16 – это обозначения для одно- или двухбайтного смещение. Биты d и w знакомы нам из предыдущего формата регистр-регистр. Все возможные комбинации mod и mem приведены в таблице 6.1.
Таблица 6.1. Значения полей mod и mem в формате регистр-память. | ||||||
Mem \ mod | 00 | 01 | 10 | 11 | ||
0 доп. Байт. | 1 доп. байт | 2 доп. байта | Формат RR | |||
000 | [BX+SI] | [BX+SI]+a8 | [BX+SI]+a16 | |||
001 | [BX+DI] | [BX+DI]+a8 | [BX+DI]+a16 | |||
010 | [BP+SI] | [BP+SI]+a8 | [BP+SI]+a16 | |||
011 | [BP+DI] | [BP+DI]+a8 | [BP+DI]+a16 | |||
100 | [SI] | [SI]+a8 | [SI]+a16 | |||
101 | [DI] | [DI]+a8 | [DI]+a16 | |||
110 | a16 | [BP]+a8 | [BP]+a16 | |||
111 | [BX] | [BX]+a8 | [BX]+a16 |
Данная таблица показывает, как зависит способ адресации от полей mem и mod. Как видим, она полностью объясняет ограничения на выбор регистров-модификаторов, которые мы сформулировали ранее. Мы не будем рассматривать машинный вид остальных форматов команд, будем изучать их только на языке Ассемблера. Напомним, что это такие форматы команд:
-
RR – (регистр – регистр);
-
RX – (регистр – память, память – регистр);
-
RI – (регистр – непосредственный операнд в команде);
-
SI – (память – непосредственный операнд в команде);
-
SS – (память – память, т.е. оба операнда в основной памяти).
6.8. Команды языка машины
Далее мы будем изучать синтаксис машинных команд и семантику их выполнения центральным процессором. Для удобства команды будем записывать так, как это принято в языке Ассемблер (можно считать, что мы уже начали понемногу изучать этот язык).
6.8.1. Команды пересылки
Команды пересылки – одни из самых распространённых команд в языке машины. Все они пересылают один или два байта из одного места памяти в другое. Для более компактного описания синтаксиса команд введём следующие условные обозначения:
r8 – любой короткий регистр AH,AL,BH,BL,CH,CL,DH,DL;
r16 – любой из длинных регистров AX,BX,CX,DX,SI,DI,SP,BP;
m8, m16 – операнды в основной памяти длиной 1 и 2 байта соответственно;
i8, i16 – непосредственные операнды в самой команде длиной 1 и 2 байта соответственно;
SR – один из сегментных регистров SS, DS, ES;
m32 – операнд в основной памяти длиной 4 байта.
Общий вид команды пересылки в нашей двухадресной ЭВМ такой (после точки с запятой будем записывать, как это принято в Ассемблере, комментарий к команде):
mov op1, op2; op1 := op2
Существуют следующие допустимые форматы операндов команды пересылки:
op1 | оp2 |
R8 | r8, m8, i8 |
R16 | r16, m16, i16, SR, CS |
M8 | r8, i8 |
M16 | r16, i16, SR, CS |
SR | r16, m16 |
Команды пересылки не меняет флаги в регистре FLAGS.
6.8.2. Арифметические команды
Изучение команд для выполнения арифметических операций начнём с команд сложения и вычитания целых чисел. Определим вид и допустимые операнды у команд сложения и вычитания:
КОП op1, op2, где КОП = add, sub, adc, sbb.
add – сложение,
sub – вычитание:
op1 := op1 op2
adc – сложение с учётом флага переноса,
sbb – вычитание с учётом флага переноса:
op1 := op1 op2 CF
Таблица допустимых операндов для этих команд:
op1 | op2 |
R8 | r8, m8, i8 |
M8 | r8, i8 |
R16 | r16, m16, i16 |
M16 | r16, i16 |
В результате выполнения операций изменяются флаги CF, OF, ZF, SF, которые отмечают соответственно за перенос, переполнение, нулевой результат и знак результата (флагу SF всегда присваивается знаковый бит результата). Эти команды меняют и некоторые другие флаги (см. [5,9]), но это нас интересовать не будет.
Далее рассмотрим команды умножения и деления целых чисел. Формат этих команд накладывает сильные ограничения на месторасположение операндов. Первый операнд всех команд этого класса явно в команде не указывается и находится в фиксированном регистре, принимаемом по умолчанию. В младшей модели семейства есть следующие команды умножения и деления, в них явно задаётся только второй операнд (второй сомножитель или делитель):
mul op2 – беззнаковое умножение,