литература / Пухальский Проектирование микропроцессорных систем 2001
.pdf4.3. Система команд МП 8086/8088 |
381 |
А & В = (ак... аха0) &(Ьк ... Ьф0) = (ак &Ьк) ... (ах& bx)(aQ& b0), |
А - ак ... a,cz0, |
где к = 7 или 15 для 8-разрядных и 16-разрядных операндов dst и src, а, и Ь, — двоичные разря ды операндов; а, & Ь, и а, — двоичные (0 или 1) разряды результата.
Выполняются команды AND, OR и XOR за 3 такта (reg —>reg), 9 + еа тактов (М —> reg),
16 + еа тактов (reg —> М), 17 + еа тактов (imm —> М), 4 такта (imm —> reg', imm —> А). Команда
NOT выполняется за 3 такта (reg), 16 + еа тактов (М). Стрелка |
>” указывает операнд- |
получатель результата операции. |
|
Задача 25. В регистре ВН сбросить в 0 разряды 4 и 1, установить в 1 разряд |
5 и проинвер- |
|||||
тировать разряды 7 и 2. Решение: |
|
|
|
|
||
AND |
ВН, OEDft |
ВН <— ВН & EDft, EDft = 1110 1101 |
(b4 |
& 0 = 0, ft, & 0 = 0) |
||
OR |
ВН, 20ft |
BH <r- BH v 20ft, |
20ft = 0010 0000 |
(b5 v |
1 = 1) |
|
XOR |
ВН, 84ft |
BH <—BH Ф 84ft, |
84ft = 1000 0100 |
(ft, © 1 = Ъъ b2 |
® 1 = b2) |
Команда TEST srcu src2. Эта команда производит над операндами srcj и src2 операцию поразрядной конъюнкции:
src, & src2.
Команда TEST подобна команде AND, но результат jrc ( & src2 не запоминается (операнды srci и src2 не изменяются). Результат выполнения команды TEST отражается только путем мо дификации флагов, используемых в командах условных переходов.
Выполняется команда TEST за 3 такта (reg & reg), 9 + еа тактов (М & reg), 11 + еа тактов
(М & imm), 4 такта (А & imm) и 5 тактов (reg & imm).
Задача 26. Запретить прерывания, если разряд 5 в регистре CL равен 1. Решение:
TEST |
CL, 20ft |
; CL & 20ft, 20ft = 0010 0000 |
JZ |
CL5_1 |
|
CLI |
|
; Флаг прерываний IF 0 |
CL5_1: |
|
|
Команды сдвигов SHL/SAL dst, cnt, SHR dst, cnt и SAR dst, cnt. Эти команды производят сдвиг разрядов операнда dst влево (команда SHL/SAL; SHL и SAL — синонимы) или вправо (команды SHR и SAR) на один разряд при cnt = 1 или на число разрядов, предварительно за данное в регистре CL, т. е. cnt - 1 или cnt = CL.
Операции сдвига разрядов операнда dst наглядно поясняет рис. 4.24 (к - 7 или 15 — для 8-разрядных и 16-разрядных операндов dst соответственно): SHL — логический сдвиг влево, SAL — арифметический сдвиг влево, SHR — логический сдвиг вправо, SAR — арифметиче ский сдвиг вправо.
Пример 16:
SHL |
DL, 1 |
; cnt = 1 |
— сдвиг содержимого регистра DL на один разряд влево |
SHR |
SI, 1 |
; cnt = 1 |
— сдвиг содержимого регистра SI на один разряд вправо |
SAL |
ВН, CL |
; cnt = CL — сдвиг содержимого регистра ВН на CL разрядов влево |
|
SAR |
DI, CL |
; cnt = CL — сдвиг содержимого регистра DI на CL разрядов вправо |
Можно задавать значения CL = 0 ... 255d (0 — сдвиг не производится, 1 — сдвиг на один разряд, как и при cnt = 1). Например, команды SHL DX, 1 и SHL DX, CL производят сдвиг вле во содержимого регистра DX на один разряд, если CL = 1. Естественно, что в этом случае предпочтительнее использовать команду SHL DX, 1. В МП 80286/80386 число сдвигов опреде ляется пятью младшими разрядами регистра CL, т. е. остатком rem(CL / 32) = 0 ... 31.
382 |
Глава 4. Микропроцессоры 8086/8088 и сопроцессор 8087 |
||||
SHL/SAL [cF]<— [лГ|<------ -------------------------------- О |
Команды арифметических сдвигов (SAL — |
||||
SHR |
|
|
|
при каждом сдвиге в младший разряд А0 посту |
|
о — |
|
|
пает 0 и SAR — старший разряд Ак при сдвигах |
||
SAR |
|
|
|
не изменяется) позволяют производить быстрое |
|
|
|
|
умножение и деление целых чисел без знака и |
||
|
|
|<-|л01<~| |
|
||
ROL |
|
|
со знаком на 2т. |
||
|
|
|
|
Все команды сдвигов воздействуют на все |
|
R °R |
j-> At -*----- >A2 -» |
-> |
CF |
шесть флагов условий (арифметические флаги). |
|
|
|
|
|
Флаг переноса CF участвует во всех операциях |
|
RCL |
C F * — Ak <----- A2 <- |
<- |
|
сдвига операнда dst — от типа команды зависит |
|
|
.H |
|
|
лишь место подключения флага CF к операнду. |
|
RCR |
Aic ->■----- >A2 |
A\ -> ^0 —>CF |
Этот флаг наиболее важен как результат выпол |
||
нения команд сдвигов. Флаги нуля ZF, паритета |
|||||
|
|
|
1 |
||
|
|
|
|
PF и знака SF сбрасываются и устанавливаются |
|
|
Рис. 4.24. Команды сдвигов |
|
по обычным правилам, а состояние флага AF не |
||
|
|
|
|
определено. |
Флаг переполнения OF содержит полезную информацию только в том случае, если число сдвигов cnt = 1. В этом случае состояние флага OF устанавливается в 1, если при сдвиге изме няется значение старшего разряда Ак при выполнении команд SHL/SAL и SHR (при выполне нии команды SAR значение разряда Акникогда не изменяется — петля на рис. 4.24). Если число сдвигов cnt Ф 1, то значение флага OF не определено.
Выполняются команды сдвига SHL/SAL, SHR и SAR за 2 такта (регистр, cnt = 1), 8 + 4/bit
тактов (регистр, cnt = CL), 15 + еа тактов (память, cnt = 1), |
20 + еа + 4/bit тактов |
(память, |
|||||
cnt = CL), где 4/bit означает 4 x CL тактов. |
|
|
|
|
|||
Пример 17: |
|
|
|
|
|
|
|
MOV |
DL, 63h |
DL <- |
0 1 1 0 0 0 1 1 = 63/г |
|
|
|
|
SHL |
DL, 1 |
DL <— 1 1 0 0 |
0 1 1 0 = C6h, |
OF = 1, CF = 0 |
|
||
SAR |
DL, 1 |
D L < - |
1 1 1 0 |
0 0 1 1 = E3A, |
OF = 0, CF = 0 |
|
|
SHR |
DL, 1 |
DL <- |
0 1 1 1 0 0 0 1 = l\h , |
OF = 1, CF = 1 |
|
||
MOV |
CL, 2 |
|
|
|
|
|
|
SHL |
DL, CL |
DL 4— 1 1 0 0 |
0 1 0 0 = С4Й, |
OF = 1, CF = 1 |
|
||
SAR |
DL, CL |
DL <— 1 1 1 1 |
0 0 0 1 =F1 h, |
OF = 1, CF = 0 |
|
||
SAL |
DL, CL |
DL 4 - 1 1 0 0 |
0 1 0 0 = C4 ft, |
OF = 1, CF = 1 |
|
||
MOV |
CL, 4 |
|
|
|
|
|
|
MOV |
SI, 54ВЗ/г |
SI <- 0101 0100 1011 0011 = 54ВЗЛ |
|
|
|||
SAL |
SI, CL |
SI 4— 0100 1011 0011 0000 = 4В30/г, CF = 1 |
|
||||
Задача |
27. Умножить число без знака X = 107с/ |
на 2 |
и разделить число без знака |
||||
K=B9E7ft на 25 с потерей остатка гет. Ответ для проверки: Р = 107с/ х 26 = |
6848с/ и |
||||||
quot = B9E57A/25 = 5CFft. Решение: |
|
|
|
|
|||
MOV |
CL, 6 |
|
|
|
|
|
|
MOV |
DX, 107d |
; DX 4— 107c/ = 006Bft |
|
|
|
||
SAL |
DX, CL |
; DX 4 - |
107c/x 26 = 1ACOft |
|
|
|
|
MOV |
CL, 5 |
|
|
|
|
|
|
MOV |
DI, 0B9E7ft |
;D I 4 - 0B9E7ft = 47591c/ |
|
|
|
||
SHR |
DI, CL |
; DI 4 - |
0B9E7ft / 25 = 5CFft 1487с/ = quot |
|
388 |
Глава 4. Микропроцессоры 8086/8088 и сопроцессор 8087 |
string1 — байты или слова. Команды, содержащие операнды dst и src, ассемблером транслиру ются в один из первых двух форматов в зависимости от типа операнда (байт или слово).
Каждая из цепочечных команд без префикса повторения REP выполняет элементарную операцию одной или двух пересылок операндов (байт/слов), расположенных в памяти. Поэтому цепочечные команды называются примитивами (эти же операции пересылок могут быть легко реализованы и другими командами).
|
|
|
|
|
Использование |
примитивов для |
||||
|
Таблица 4.14. Адресация цепочек |
|
выполнения |
операций |
над длинными |
|||||
Операнд |
Адрес |
Автоинкремент |
Автодекремент |
цепочками |
позволяет |
существенно |
||||
уменьшить затрачиваемое на это вре |
||||||||||
(флаг DF = 0) |
(флаг DF = 1) |
|||||||||
|
|
мя — при выполнении примитива |
||||||||
src8 |
D S : SI |
SI = SI + 1 |
SI = SI - |
1 |
||||||
автоматически производится |
адреса |
|||||||||
5Тс16 |
D S : SI |
SI = SI + 2 |
SI = SI - 2 |
|||||||
ция следующего элемента в цепочке. |
||||||||||
dst# |
E S : SI |
DI = DI + 1 |
DI = DI - |
1 |
||||||
В табл. 4.14 |
приведен |
способ адреса |
||||||||
dst16 |
E S : SI |
DI = DI + 2 |
DI = DI - 2 |
|||||||
ции операндов, реализованный в при |
||||||||||
|
|
|
|
|
||||||
|
|
|
|
|
митивах и не зависящий от исполь |
|||||
зуемого |
формата |
команды. Цепочки операндов могут находиться |
как в |
одном |
сегменте |
(ES = DS), так и в разных не перекрывающихся сегментах (ES Ф DS). В цепочечных командах для операнда-источника src можно использовать префикс замены сегментного регистра, а в качестве сегментного регистра операнда-получателя dst всегда используется регистр ES.
П рефиксы повторения REP/REPZ/REPE и REPNZ/REPNE. С цепочечными командами MOVS, LODS или STOS, не изменяющими флаги условий, достаточно использовать префикс повторения REP, задающий число повторений, указанное в регистре СХ. В цепочечных коман дах CMPS и SCAS, производящих сравнение символов в двух цепочках и сравнение символов одной цепочки с символом в аккумуляторе, для окончания повторений добавочно используется состояние флага ZF. Поэтому имеется два альтернативных префикса повторений:
REP/REPZ/REPE (синонимы; повторять пока ноль/повторять пока равно) — повторение выполнения цепочечных команд пока СХ Ф0 и флаг ZF = 1;
REPNZ/REPNE (синонимы; повторять пока не ноль/повторять пока не равно) — повторе ние выполнения цепочечных команд пока СХ ^ 0 и флаг ZF = 0.
Исходное состояние флага ZF не влияет на число повторений — проверка состояния флага ZF производится только после очередного выполнения команды CMPS или SCAS. Проверка значения СХ на нуль проводится перед очередным выполнением любой цепочечной команды, поэтому, если сразу задать значение СХ = 0, то команда не будет выполнена ни разу. В принци пе, для префикса повторения можно использовать только две альтернативных мнемоники REP
и REPNZ.
Если выполнение цепочечной команды будет прервано между повторениями, то после возврата из прерывания ее выполнение будет корректно продолжено.
Выполняются префиксы повторений за 2 такта.
Команды MOVS dst, src, MOVSB и MOVSW . Эти команды выполняют пересылку цепо
чек (строк) байт или слов: |
|
|
M(ES:DI) <- M(DS:SI), SI <- SI + m, DI <- DI + m, если DF = 0; |
|
|
M(ES:DI) <- M(DS:SI), SI <— SI —m, DI <- DI - m, если DF = 1, |
|
|
где M — Memory (память), m = 1 для байт и m = 2 для слов. |
- |
: |
4.3. Система команд МП 8086/8088 |
389 |
Выполняются команды за 18 тактов (без повторения) и 9 + 17/гер тактов (с повторением), где П /rep означает 17 х СХ тактов.
Задача 30. Переслать таблицу векторов прерывания персонального компьютера, находя щуюся по адресам 0000 : 0000 ... 0000 : 03FFA, в область памяти, определяемую программой пользователя. Решение:
; Пересылка таблицы векторов прерываний для команд INT type
sseg |
segment |
para STACK |
; Сегмент стека |
|
s_seg |
db |
32 dup (‘St’) |
; Стек — 32 слова |
|
ends |
|
|
; Конец сегмента стека |
|
d_seg |
segment |
|
|
; Сегмент данных |
buff |
db |
256 dup(‘B u ff) |
; Buffer address = 0000 - 03 FF/г (512 слов) |
|
d_seg |
ends |
|
|
; Конец сегмента данных |
c_seg |
segment |
|
|
; Сегмент кода |
main |
assume |
CS: c_seg, DS: d_seg, SS: s_seg, ES: d_seg |
||
proc |
far |
Начало процедуры main |
||
|
push |
ds |
Запись в стек начального адреса PSP (Program Segment Prefics) |
|
|
sub |
ax, ax |
|
и 0000h (для возврата в DOS) |
|
push |
ax |
|
|
|
mov |
ax, d_seg |
|
|
|
mov |
ds, ax |
Инициализация сегментного регистра DS |
|
|
mov |
es, ax |
ES = DS |
|
; Передача в буфер buff таблицы векторов прерываний команд INT type |
||||
|
PUSH |
DS |
SP <— SP - 2, М(SP) <— DS (сохранение в стеке DS) |
|
|
XOR |
AX, AX |
АХ 4 - 0000/г |
|
|
MOV |
DS, AX |
DS |
0000/г |
|
MOV |
SI, AX |
SI <—0000/г, DS.SI = 0000:0000k — начальный адрес таблицы |
|
|
LEA |
DI, buff |
DS |
адрес буфера buff, ES.DI — начальный адрес буфера |
|
MOV |
CX, 200h |
|
|
|
CLD |
|
DF 0 (автоинкремент) |
|
REP |
MOVSW |
|
M(ES:buff) <- M(DS:SI), SI = SI + 2, DI = DI + 2 |
|
|
POP |
DS |
DS |
M(SP), SP <— SP + 2 (извлечение DS из стека) |
main |
RET |
|
; Конец процедуры main |
|
endp |
|
|||
c_seg |
ends |
main |
Конец сегмента кода |
|
|
end |
Конец программы |
В этой программе использована команда MOVSW, явно указывающая на пересылку слов, поэтому не имеет значения, что буфер buff определен как байтовый. Программа написана с уче том требований языка ассемблера — программа транслируется в загрузочный модуль (ехе-файл), что позволяет просмотреть векторы прерываний с помощью отладчика программ (см. § 4.4). Так, для системного прерывания по ошибке деления INT 0 вектор (адрес) вызова подпрограммы обработки прерывания CS : IP = 2F2A : 0258 в PC Pentium II (естественно, на разных компьютерах будут получаться разные вектора, если их операционные системы не сов падают). Эта подпрограмма выводит на экран дисплея сообщение: Your program caused a divide overflow error. If the problem persists, contact your program vendor (Ваша программа вызвала ошибку переполнения при делении. Если проблема продолжает существовать, войдите в кон такт с вашим продавцом программы).