литература / Пухальский Проектирование микропроцессорных систем 2001
.pdf350 |
Глава 4. Микропроцессоры 8086/8088 и сопроцессор 8087 |
|
|||||
|
|
|
|
Команда |
Базовая индексная адресация |
|
|
|
Непосредственная |
Данное |
|
||||
|
Команда |
Регистр |
|
||||
|
|
адресация |
|
|
|||
|
|
Команда |
|
Регистр |
|
|
|
|
Регистровая |
Регистр |
|
Данное |
|
|
|
|
адресация |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
Команда |
|
Память |
|
|
|
|
Прямая |
ЕЛ |
— > Данное |
|
|
|
|
|
адресация |
|
|
|
|||
|
|
|
|
|
|
|
|
|
Косвенная регистровая адресация |
Относительная базовая индексная |
адресация |
||||
|
Команда |
Регистр |
|
Память |
Команда |
|
|
|
Регистр |
ЕА |
-> |
Данное |
Базовый Индексный |
Смещение |
|
|
|
|
|
|
регистр |
|
|
|
Регистровая относительная |
|
|
Регистр |
Память |
||
|
Команда |
|
адресация |
|
Индекс |
SEA |
|
|
|
|
|
|
|
|
Регистр
Базовый
адрес
Рис. 4.21. Режимы адресации данных
Если поле mod * 1 1 , один из операндов находится в памяти и ее эффективный адрес ЕА вычисляется согласно табл. 4.9. Значение поля mod = 00 указывает на отсутствие смещения, за исключением значения поля г/т = 110, задающего прямую адресацию. Если значение поля mod = 01, то третий байт команды содержит 8-разрядное смещение disp%, которое до вычисле ния эффективного адреса ЕА автоматически расширяется со знаком до 16 разрядов. Значение поля mod = 1 0 означает, что третий и четвертый байты команды содержат 16-разрядное смеще ние disp 16. Если же значение поля mod = 11, то операндом является регистр, адрес которого определяется полем г/т. Непосредственный режим адресации в табл. 4.9 отсутствует, так как 8- или 16-разрядный непосредственный операнд является частью команды.
На рис. 4.21 графически изображены определения операндов для всех допустимых режи мов адресации данных. Не следует забывать, что физический адрес памяти данных определяет ся эффективным адресом ЕА и соответствующим сегмен^ым регистром — D.S, ES или SS. Многочисленные примеры команд, иллюстрирующих все семь методов адресации данных, приведены в листинге, находящемся в самом конце § 4.4 (с. 442 - 444).
В табл. 4.9 указаны также сегментные регистры, используемые по умолчанию при вычис лении 20-разрядного физического адреса памяти для различных комбинаций полей mod и г/т. Сегментный регистр стека SS используется по умолчанию при адресации операндов с привле чением указателя базы ВР, а в остальных случаях в вычислении физического адреса памяти участвует сегментный регистр данных DS. Для изменения используемых по умолчанию сег ментных регистров, в систему команд введена специальная однобайтная команда, называемая префиксом замены сегмента. Формат этой команды представлен на рис. 4.22. Если команде предшествует префикс замены сегмента, то при обращении к данным в процессе ее выполнения участвует сегментный регистр, определяемый полем reg в соответствии с табл. 4.8.
Сегментный регистр DS допускается заменять сегментными регистры CS, SS или ES, а сегментный регистр SS при участии в адресации регистра ВР — на DS, CS или ES. Замену сегментного регистра нельзя производить в следующих специальных случаях:
352 |
Глава 4. Микропроцессоры 8086/8088 и сопроцессор 8087 |
Отметим, что физический адрес перехода равен сумме нового содержимого указателя ин струкции IP и содержимого сегментного регистра кода CS, умноженного на 1610. Межсегмент ный переход может быть только безусловным. Графически определения адресов переходов изо бражены на рис. 4.23.
Время выполнения команд. Базовым временем выполнения команды называется время, затрачиваемое на выполнение команды уже находящейся в очереди команд. В противном слу чае необходимо учитывать дополнительные такты синхронизации CLK, необходимые для вы борки команды — на каждое обращение к памяти при чтении команд затрачивается 4 такта синхронизации. Если операнд находится в памяти, то затрачивается дополнительное время еа на вычисление эффективного адреса ЕА. Это время зависит от режима адресации (см.
табл. 4.9):
прямая — 6 тактов, косвенная регистровая — 5 тактов,
регистровая относительная — 9 тактов,
базовая индексная — 7 тактов при ЕА = BP + DI или ЕА = ВХ + SI, базовая индексная — 8 тактов при ЕА = BP + SI или ЕА = ВХ + DI, относительная базовая индексная — 11 тактов при
ЕА = BP + DI + disp и ЕА = ВХ + SI + disp,
относительная базовая индексная — 12 тактов при
ЕА = BP + SI + disp и ЕА = ВХ + DI + disp.
Например, на выполнение команд сложения ADD, приведенных на рис. 4.19, требуется число тактов синхронизации:
регистр - |
регистр............................................................... |
|
3, |
память - |
регистр................................................................. |
|
9 + еа, |
регистр - |
память................................................................. |
|
16 + еа, |
непосредственный операнд - |
регистр........................... |
4, |
|
непосредственный операнд - |
память............................. |
17 + еа, |
|
непосредственный операнд - |
аккумулятор.................. |
4. |
Время выполнения команды можно определить умножением числа тактов синхронизации, необходимых для выполнения команды, на период тактового сигнала CLK. Время выполнения команд условных переходов зависит от выполнения или невыполнения условия перехода. Базо вые времена выполнения команд приведены при их описании в § 4.3.
4.3. Система команд МП 8086/8088
По назначению команды МП 8086/8088 разделяются на 6 групп (табл. 4.10). Команды на языке ассемблера имеют вид:
СОР; СОР dsv, СОР src\ СОР dst, src,
где СОР — мнемоника кода операции, dst — операнд-получатель, src — операнд-источник
(dst— Destination, src — Source). В однобайтных командах операнды в явном виде отсутст вуют — указание на используемые операнды заключено в коде операции СОР (неявная адреса ция операндов). Например, при выполнении команды XLAT используются операнды, находя щиеся в регистрах AL и ИХ. В двухоперандных командах операнды разделяются запятой, и опе ранд-получатель указывается слева от запятой.
356 |
|
Глава 4. Микропроцессоры 8086/8088 и сопроцессор 8087 |
|
|||||
|
Таблица 4.12. Команды, определяемые кодом операции постбайта |
|
||||||
Группа |
|
Трехразрядный код операции xxx постбайта mod xxx r/m |
|
|||||
КОП |
000 |
001 |
010 |
011 |
100 |
101 |
110 |
111 |
(МК) |
||||||||
A rO pl |
ADD |
OR |
ADC |
SBB |
AND |
SUB |
XOR |
CMP |
(80,81) |
r/m, imm |
r/m, imm |
r/m, imm |
r/m, imm |
r/m, imm |
r/m, imm |
r/m, imm |
r/m, imm |
АгОр2 |
ADD |
|
ADC |
SBB |
|
SUB |
|
CMP |
(82, 83) |
r/m, imm |
|
r/m, imm |
r/m, imm |
|
r/m, imm |
|
r/m, imm |
ShfOp |
ROL |
ROR |
RCL |
RCR |
SHL/SAL |
SHR |
|
" RAR |
(DO + D3) |
dst, cnt |
dst, cnt |
dst, cnt |
dst, cnt |
dst, cnt |
dst, cnt |
|
dst, cnt |
G rp l |
TEST |
|
NOT |
NEG |
MUL |
IMUL |
DIV |
IDIV |
(F6, F7) |
r/m, imm |
|
dst |
dst |
src |
src |
src |
src |
Grp2 |
INC |
DEC |
|
|
|
|
|
|
(FE) |
r/mS |
r/m8 |
|
|
|
|
|
|
Grp3 |
INC |
DEC |
CALL |
CALL |
JMP |
JMP |
PUSH |
|
(FF) |
r/m 16 |
r/m 16 |
near |
far |
near |
far |
r/m |
|
Представление целых чисел без знака и со знаком. МП 8086/8088 могут выполнять арифметические операции сложения, вычитания, умножения и деления над операндами орег, представляющими собой как целые числа без знака, так и целые числа со знаком. Для пред ставления величины целого числа без знака используются все разряды операнда орег. Посколь ку 28 = 256d и 216 = 65536с?, то диапазон представимых чисел орег без знака равен
0 < oper% < 255d = FFh и 0 < орег 16 < 65535с/ = FFFFh
(орег% — байт, орег 16 — слово).
При сложении целых чисел без знака проблема переполнения разрядной сетки отсутству ет, так как перенос (0 или 1) из старшего разряда суммы фиксируется во флаге переноса CF. Полученное значение переноса CF всегда может быть использовано для получения правильного результата вычислений.
Для представления чисел со знаком используется их дополнительный код, в котором старший разряд операнда орег определяет знак числа:
0 — число положительное, 1 — число отрицательное,
а значит диапазон представимых абсолютных значений (модулей) чисел будет меньше. Так как число 0 отнесено к положительным числам и одна половина значений операнда орег представ ляет положительные числа, а другая — отрицательные, то диапазон представимых чисел со знаком равен
- \2 Ы < oper% < +I21d и -32768с/ < орег 16 < +32767J,
т. е. минимальные и максимальные значения определяются соотношениями:
-2 7 = -128, +(27 - 1) = +127 (для орег%) и - 2 15 = -32768с/, +(215 - 1) = +32767J (т яо р егЩ .
Дополнительный код [орег\д числа орег определяется двумя равносильными соотноше ниями:
4.3. Система команд МП 8086/8088 |
357 |
|
[орег]д = орег, если орег > О, |
[орег]д = орег, если орег > О, |
|
[орег\д = О - | орег |, если орег < О, |
[орег]д = | орег | + 1, если орег < |
О, |
где | орег | — модуль отрицательного числа орег, О - | орег | — двоичное дополнение модуля отрицательного числа (Two's Complement), \ орег | — поразрядно инвертированный модуль отрицательного числа. Дополнительный код положительного числа совпадает с самим числом, поэтому требуется вычислять дополнительный код только отрицательных чисел. Возникающий при вычитании из нуля модуля отрицательного числа орег заем игнорируется, хотя флаг переноса/заема CF устанавливается в 1.
Так как дополнительный код отрицательного числа [орег]а = 0 - ( орег |, то модуль отрица тельного числа | орег | = 0 - [орег\д, а значит справедливо и соотношение
| орег | = [орег]д + 1.
Эти соотношения позволяют вычислять модуль отрицательных чисел по их дополнитель ному коду двумя способами, идентичным двум способам вычисления дополнительных кодов по модулям отрицательных чисел. Первый способ удобно использовать для контрольных вычис лений с помощью калькулятора, имеющегося в графической операционной системе Windows 95/98 персональных компьютеров IBM PC, а второй — для вычислений вручную с помощью карандаша и бумаги.
Примеры десятичных чисел, представимых одним байтом в дополнительном коде:
[+0]д |
= |
0000 0000, |
[-0]д =0000 0000, |
|||
[+1]д |
= |
0000 0001, |
[ - 1 ] д |
= 1 1 1 1 1 1 1 1 , |
||
[+126]д = 0111 |
1110, |
[—127]д |
= |
1000 0001, |
||
[+127]д |
= |
0111 |
1111, |
[—128]д |
= |
1000 0000. |
Сложение чисел в дополнительном коде основывается на теореме [5]:
если при сложении разрядная сетка не переполняется, то дополнительный код арифмети ческой суммы [орегх + орег2]д двух двоичных чисел opert и орег2 любых знаков равен арифме тической сумме дополнительных кодов этих чисел
[орегх + орег2]д = [орег\\д + [орег2]д — возможный перенос игнорируется;
если числа орег\ > 0, орег2 > 0 и орег\ + орег2 > 2п (п — число разрядов чисел без уче та знакового разряда), то происходит переполнение разрядной сетки (флаг OF = 1) с потерей значения +2" и изменением знака остатка суммы на противоположный, что фиксируется во фла ге SF;
если орег\ < 0 и орег2 < 0 и | орег[ | + | орег2 \ > 2" + 1, то происходит переполнение раз рядной сетки (флаг OF = 1) с потерей значения -2" и изменением знака остатка суммы на про тивоположный, что фиксируется во флаге SF.
Пример 1. Десятичные числа орег\ = -98(/ и орег2 = +75с/ (байты) в дополнительном коде имеют представление: [орег\\д = 0 - | operx | = 9Еh и [орег2]д = орег2 = 4В 1г. Сумма десятичных чисел operi + орег2 = -23 d, а дополнительный код суммы определяется арифметическим сложе нием дополнительных кодов чисел:
дополнительный код орег\ —> 1 0 0 1 1 1 1 0 = 9Еh — число отрицательное
+ |
0 |
1 |
0 |
0 |
■ |
0 |
1 |
1 |
= |
4Вh |
— число положительное |
дополнительный код орег2 —¥ |
1 |
||||||||||
|
--------------- |
|
|
|
1-------------- |
|
|
|
|
Е9h |
|
дополнительный код суммы —> |
1 |
1 |
1 |
0 |
1 |
0 |
0 |
1 |
= |
— число отрицательное |
358 |
Глава 4. Микропроцессоры 8086/8088 и сопроцессор 8087 |
Модуль | орег\ + орег21= 0 - Е9h = 1 1 1 0 1 0 0 1 + 1 = \ lh = 23d. |
|
Пример 2. |
Положительные десятичные числа орег^ = + 9Ы и oper2 - + 15d (байты) в допол |
нительном коде имеют представление: [орегх\д = орег\ = 62h и [орег2]д = oper2 = 4Вh. Сумма орегу + орег2 = 173d > 27 = 128с?, т. е. при их сложении произойдет переполнение разрядной сет ки. Проверка:
|
0 1 |
1 0 ^ 0 0 1 0 = 62h — число положительное |
Флаги: |
+ 0 1 0 0 1 0 1 |
1 = 4В h — число положительное |
OF<— 1,C F « —0 |
1 0 1 0 1 1 0 1 |
= ADA — число отрицательное |
Пример 3. Отрицательные десятичные числа орег\ = -98 d и oper2 = - 15d в дополнительном коде имеют представление: [орег{]д = 0 - | operx | = 9Еh и [орег2]д = 0 - | орег2 | = В5h. Сумма модулей этих чисел | орег{ \ + | орег2 \ - 173d > 27 + 1 = 129d, т. е. при их сложении произойдет переполнение разрядной сетки. Проверка:
|
1 0 |
0 1 |
1 |
1 |
|
1 0 |
= 9Еh |
— число отрицательное |
|
Флаги: |
I |
|
1 |
1 |
1 |
0 |
1 = |
В5h |
— число отрицательное |
1 0 1 |
0 |
||||||||
OF <— 1, CF <— 1 |
0 1 |
0 |
1 |
0 |
0 |
1 |
1 = 5 Зй |
— число положительное |
Логика обнаружения переполнения весьма проста: переполнение разрядной сетки при сложении чисел в дополнительном коде происходит только в том случае, если функция
C s. | © Q = 1,
где Cs — перенос в знаковый разряд, Cs+i — перенос из знакового разряда, фиксируемый во флаге переноса CF [5]. В микропроцессорах 8086/8088 переполнение разрядной сетки при сло жении чисел в дополнительном коде фиксируется во флаге переполнения OF. Этот флаг уста навливается в 1 также и при выполнении других арифметических и логических команд (см.
табл. 4.13 на с. 384 - 387).
Программист должен корректно использовать флаги, фиксирующие результат выполнения команд, для выполнения условных переходов. Ярким примером служит некорректное исполь зование флага знака SF, в котором при выполнении арифметических операций фиксируется значение старшего разряда байта/слова. Команды условных переходов JS и JNS используют этот флаг, однако, при сложении чисел без знака значение флага SF = 1 не означает, что было получено отрицательное число (при выполнении многих команд МП в принципе не может “уз нать”, с какими типами чисел он производит операции).
Форматы команд МП 8086/8088. Ниже приведены форматы всех команд МП 8086/8088. Если команда способна адресовать операнд в памяти (в команде есть поле r/m), то она может содержать еще один или два байта смещения (dispS или disp 16).
Для непосредственных операндов будет указываться только один байт данных с общим обозначением data 8/16 (data 8 — один байт при значении индикатора w - 0, data 16 — два байта при значении индикатора w = 1, причем сначала идет младший, а затем старший байт данных).
Максимальная длина команд равна шести байтам. Далее при описании команд будет ис пользоваться не более трех байт, но для любой команды с сокращенной длиной очень легко установить ее полный формат, так как исключаются только старший байт у двухбайтового не посредственного операнда (если он есть) и один или два байта смещений disp8 и disp 16 у ко манд, имеющих поле r/т. Только у двух команд прямой межсегментной передачи управления (команды CALL и JMP) приведены полные пятибайтовые форматы.
Воздействие команд на флаги будет приведено в табл. 4.13 (с. 384 - 387).