литература / Пухальский Проектирование микропроцессорных систем 2001
.pdf360 |
Глава 4. Микропроцессоры 8086/8088 и сопроцессор 8087 |
|
|
||||||||||||||
шепшческие команды |
7 |
|
Байт 1 |
|
0 |
7 |
Байт 2 |
0 7 |
Байт 3 0 |
||||||||
ADD — сложить (add) |
|
|
O O O O O O r f w mod |
|
|
j |
|
|
|
||||||||
Регистр/память с регистром |
|
|
reg |
r/m |
|
|
|||||||||||
Непосредственный операнд с регистром/памятью |
l O O O O O s w mod 0 |
0 |
Oi |
r/m |
data |
8/16 |
|||||||||||
Непосредственный операнд с аккумулятором |
0 0 0 |
0 0 |
1 |
0 w |
data |
8/16 |
|
|
|||||||||
ADC — сложить с переносом (add with carry) |
0 0 0 1 0 0 |
|
|
|
|
|
i |
|
|
|
|||||||
Регистр/память с регистром |
|
d w mod) |
|
reg |
r/m |
|
|
||||||||||
Непосредственный операнд с регистром/памятью |
1 0 0 0 0 0 |
s w mod',0 1 Oi |
r/m |
data |
8/16 |
||||||||||||
Непосредственный операнд с аккумулятором |
0 0 0 |
1 0 |
1 0 w |
data |
8/16 |
|
|
||||||||||
INC — инкремент (increment); |
dst <— dst + 1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Регистра/памяти |
|
* |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
w modi 0 |
0 |
0: |
r/m |
|
|
||
Регистра |
|
* |
0 1 0 0 01 reg |
|
|
|
|
|
|
|
|||||||
AAA — Л5 С//-коррекция для сложения (ASCII adjustfor add) |
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
0 0 |
1 1 0 |
1 1 1 |
|
|
|
|
|
|
|
|||||
DAA — десятичная коррекция для сложения (decimal adjust for add) |
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|0 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
|
|
|
|
|
|
|
SUB — вычесть (subtract) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Регистр/память из регистра |
|
0 0 |
1 0 |
1 0 |
d w mod1, |
|
reg |
|
r/m |
|
|
||||||
Непосредственный операнд из регистра/памяти |
l O O O O O s w |
mod\ 1 0 |
1 |
r/m |
data |
8/16 |
|||||||||||
Непосредственный операнд из аккумулятора |
0 |
0 |
1 0 |
1 |
1 |
0 w |
data |
8/16 |
|
|
|||||||
SBB — вычесть с заемом (subtract with borrow) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
Регистр/память из регистра |
|
0 |
0 |
0 |
1 |
1 |
0 |
d w mod\ |
|
reg |
|
r/m |
|
|
|||
Непосредствен, операнд из регистра/памяти |
l O O O O O s w |
mod, 0 |
1 |
1 |
r/m |
data |
8/16 |
||||||||||
Непосредственный операнд из аккумулятора |
0 |
0 |
0 |
1 |
1 |
1 |
0 w |
data |
8/16 |
|
|
||||||
DEC — декремент (decrement); |
dst <— dst - 1 |
|
|
|
|
|
|
1 w mod\0 |
|
|
|
|
|
||||
Регистра/памяти |
|
* |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
r/m |
|
|
||||
Регистра |
|
* |
0 |
1 |
0 0 |
11 |
|
reg |
|
|
|
|
|
|
|
||
NEG — изменить знак числа (change sign) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
1 |
1 |
1 |
1 |
0 |
1 |
I |
wmodiO |
1 |
1 |
r/m |
|
|
||
CMP — сравнить (compare) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Регистр/память и регистр |
|
0 |
0 |
1 |
1 |
1 |
0 |
d |
W m o d |
|
r e g |
|
r /m |
|
|
||
Непосредственный операнд и регистр/память |
l O O O O O s w m o d \ |
1 |
1 |
1 |
r /m |
d a ta |
8/16 |
||||||||||
Непосредственный операнд и аккумулятор |
0 0 1 1 1 1 |
0 |
w |
d a t a |
8/16 |
|
|
||||||||||
AAS — ASC/1-коррскиия для вычитания (ASCII adjustfor subtract) |
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
|
|
|
|
|
|
|
DAS — десятичная коррекция для вычитания |
0 0 |
1 0 |
1 1 1 1 |
|
|
|
|
|
|
|
|||||||
|
(decimal adjustfo r subtract) |
|
|
|
|
|
|
|
|||||||||
MUL — умножить целые числа без знака (multiply unsigned) |
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
1 |
1 |
1 |
1 |
0 |
1 |
1 w modi 1 0 0 |
r/m |
|
|
IMUL — умножить целые числа со знаком (integer multiply signed)
l l l l O l l w modi 1 0 1 1 r/m
AAM — А5 С//-коррекция для умножения (ASCII adjust for multiply)
1 1 0 1 0 1 0 0 0 0 0 0 1 0 1 0
362 |
Глава 4. Микропроцессоры 8086/8088 и сопроцессор 8087 |
|
||||||||||
Команды манипуляции цепочками |
|
|
Байт 1 |
|
О |
|
|
|
||||
REP — повторять операцию до СХ = 0 (repeat) |
|
|
|
|
|
|
|
z |
|
|
|
|
REP/REPZ/REPE (г = 1), REPNZ/REPNE (г = 0) |
1 |
1 |
1 |
1 |
0 0 |
1 |
|
|
|
|||
MOVS — переслать байт/слово (move byte/word) |
1 0 1 0 0 1 |
0 w |
|
|
|
|||||||
MOVS/MOVSB/MOVSW |
|
|
|
|||||||||
CMPS — сравнить байт/слово (compare byte/word) |
1 0 |
1 0 |
0 1 |
1 w |
|
|
|
|||||
CMPS/CMPSB/CMPSW |
|
|
|
|||||||||
SCAS — сканировать байт/слово (scan byte/word) |
1 0 1 0 1 |
1 |
l w |
|
|
|
||||||
SCAS/SCASB/SCASW |
|
|
|
|||||||||
LODS — загрузить байт/слово в AL/AX (load byte/word to AL/AX) |
0 w |
|
|
|
||||||||
LODS/LODSB/LODSW |
1 |
0 1 |
0 1 |
1 |
|
|
|
|||||
STOS — запомнить байт/слово из AL/AX (store byte/word from AL/AX) |
|
|
|
|||||||||
STOS/STOSB/STOSW |
11 |
0 |
1 |
0 |
1 |
0 |
1 w |
|
|
|
||
Команды передачи управления |
|
|
Байт 1 |
|
0 7 Байт 2 |
0 7 |
Байт 3 0 |
|||||
CALL — вызов процедуры (подпрограммы) |
|
|
|
|
|
|
|
|
disp low |
disp high |
||
Прямой внутрисегментный [near) |
1 1 1 0 |
1 0 |
0 0 |
|||||||||
Косвенный внутрисегментный (near) |
1 1 1 1 1 1 1 1 |
mod\0 1 0! |
r/m |
|
||||||||
Прямой межсегментный (far) |
1 0 |
0 |
1 |
1 0 |
10 |
offset low |
offset high |
|||||
|
|
|
|
|
|
|
|
|
|
seg low |
|
seg high |
Косвенный межсегментный (far) |
1 1 1 1 1 1 1 1 |
mod, 0 1 1 j |
r/m |
|
||||||||
JMP — безусловный переход (unconditionaljump) |
|
|
|
|
|
|
|
|
|
|
|
|
Прямой внутрисегментный (near) |
1 1 1 0 |
1 0 |
0 |
1 |
disp low |
disp high |
||||||
Прямой внутрисегментный короткий (short) |
1 1 1 0 |
1 0 |
11 |
disp# |
|
|
||||||
Косвенный внутрисегментный (near) |
1 1 1 1 1 1 1 1 |
mod\ 1 0 0 j |
r/m |
|
||||||||
Прямой межсегментный (far) |
1 1 1 0 |
1 0 |
1 0 |
offset low |
offset high |
|||||||
|
|
|
|
|
|
|
|
|
|
seg low |
|
seg high |
Косвенный межсегментный (far) |
1 1 1 1 1 1 1 1 |
mod\ 1 0 1' |
r/m |
|
||||||||
Внутрисегментный (near) |
1 |
1 |
0 0 |
0 0 |
1 |
1 |
|
|
|
|||
Внутрисегментный и SP + /ml6 (near) |
1 |
1 0 0 0 0 |
1 |
0 |
data low |
data high |
||||||
Межсегментный (far) |
|
1 1 0 |
0 |
1 0 |
11 |
|
|
|
||||
Межсегментный и SP + im\6 (far) |
1 1 0 |
0 1 0 |
10 |
data low |
data high |
|||||||
JE/JZ — перейти, если нуль/если равно (jump on zero/on equal) |
|
|
|
|
|
|
||||||
Флаг ZF = 1 |
|
0 |
1 1 1 0 |
1 0 |
0 |
dispS |
|
•кропэП |
||||
JNE/JNZ — перейти, если не нуль/если не равно (jump on not zero/oti not equal) |
|
|
||||||||||
Флаг ZF = 0 |
|
0 1 1 1 0 |
10 |
1 |
disp& |
|
|
|||||
JS — перейти, если знак установлен (jump on sign) |
|
|
|
|
|
|
|
|
dispf. |
|
|
|
Флаг SF = 1 |
|
0 |
1 1 1 1 0 |
0 0 |
|
|
||||||
JNS — перейти, если знак сброшен (jump on not sign) |
|
|
|
|
|
|
|
|
|
|
||
Флаг SF =0 |
|
0 |
1 1 1 1 0 |
0 |
1 |
dispS, |
|
|
364 |
Глава 4. Микропроцессоры 8086/8088 и сопроцессор 8087 |
||||||
Команды управления процессором |
|
7 |
|
Байт 1 |
0 7 Байт 2 0 |
||
CLC — сбросить флаг переноса (clear carry) |
|
1 |
1 |
1 1 1 0 0 0 |
|||
CF<r- 0 |
|
* |
|||||
CMC — инвертировать флаг переноса (complement carry) |
|
|
|
||||
C F «—CF |
t. ..... |
* |
1 |
1 |
1 1 0 |
1 0 |
1 |
STC — установить флаг переноса (set carry) |
|
1 |
1 |
1 1 1 0 0 |
1 |
||
CF <—1 |
|
* |
|||||
CLD — сбросить флаг направления (clear direction) |
|
|
|
|
|
||
D F < - 0 |
|
* 1 1 1 1 1 1 0 0 |
|||||
STD — установить флаг направления (set direction) |
* 1 1 1 1 1 1 0 1 |
||||||
DF <— 1 |
|
||||||
CLI — сбросить флаг прерывания (clear interrupt) |
* 1 1 1 1 1 0 10 |
||||||
IF <r- 0 |
|
||||||
STI — установить флаг прерывания (set interrupt) |
* 1 1 1 1 1 0 11 |
||||||
IF <—1 |
|
||||||
HLT — остановить (halt) |
|
1 |
1 |
1 1 0 |
1 0 |
0 |
|
|
|
|
WAIT — ожидать активного значения сигнала TEST (wait)
1 0 0 1 1 0 11
ESC — переключиться на сопроцессор (escape — to external device)
1 1 0 1 1 X X X modix x x! r/m
LOCK — префикс блокировки шины (bus lock prefix)
1 1 1 1 0 0 0 1
П р и м е ч а н и е : символом |
отмечены команды, не требующие дополнительного пояснения. |
Описание команд. Многие команды МП 8086/8088 выполняют те же операции, что и ко манды МП 8080/8085 (например, команды MOV, AND, OR и др.). Различия таких команд за ключаются лишь в методах адресации операндов, размерах операндов (байт/слово) и способах записи некоторых однотипных для МП 8086/8088 и 8080/8085 команд на языке ассемблера. Так, если регистр содержит адрес операнда, находящегося в памяти, то он заключается в пря мые скобки (на языке ассемблера для МП 8086/8088). Ниже приведено детальное описание всех команд, не отмеченных символом “*”, в последовательности, соответствующей последователь ности вышеприведенного описания их форматов, за исключением случаев, противоречащих логике изложения материала. Так, команды передачи данных PUSH, POP, PUSHF и POPF будут описаны в группе команд передачи управления (описание всех команд, использующих стек, сосредоточено в одном месте).
1. Команды передачи данных
Команды M OV dst, src. Эти команды выполняют операции передачи данных:
dst <— src.
Можно использовать как непосредственные операнды imm, так и операнды, находящиеся в аккумуляторе (А), регистрах (reg), сегментных регистрах (seg) и в памяти (М).
4.3. Система команд МП 8086/8088 |
367 |
щью префикса замены сегмента и в не стандартной форме: segES XLAT. Пример использова ния команды XLAT имеется в задаче 10.
Команда LEA г 16, addr. Эта команда вычисляет эффективный адрес ЕА операнда, нахо дящегося в памяти, в соответствии с заданным режимом адресации и помещает его значение в указанный регистр:
rl 6 <— addr.
В символике команды использовано специальное обозначение addr = src для конкретиза ции операнда-источника (он может находиться только в памяти).
Выполняется команда за 2 + еа тактов.
Пример 9: LEA BP, [BXJ[SIj; BP ВХ + SI = ЕД.
Команды LDS г 16, тет и LES г16, тет. Эти команды загружают полный указатель из памяти и записывают его в пару регистров DS: г!6 или ES: г16 соответственно:
rl 6 <— M(addr), DS <— M(addr + 2) и /16 ^— M(addr), ES <—M(addr + 2).
В символике команды использовано специальное обозначение тет = src для конкретиза ции операнда-источника (он может находиться только в памяти М).
Выполняются команды за 16 + еа тактов.
Пример 10:
LDS |
SI, [BXJ |
; SI |
Л*(ВХ), DS <- Л4(ВХ + 2) |
LES |
DI, [BP] |
; DI |
Л/(ВР), ES <- М(ВР + 2) |
2.Арифметические команды
ВМП 8086/8088 можно использовать пять типов представления исходных чисел, над ко торыми производятся арифметические операции:
целые числа без знака — все разряды байта и слова определяют величину числа; целые числа со такам — числа представлены в дополнительном коде (старшие разряды
байта и слова задают знак числа);
упакованные BCD-числа (Binary Coded Decimal —- код 8 -4 -2 -1) — в одном байте содер жится двухразрядное десятичное число от 00 до 99d (для каждой десятичной цифры использу ется одна тетрада);
неупакованные BCD-числа — в одном байте содержится одноразрядное десятичное число
от 00 до 09d (старшая тетрада содержит код 0000/;);
десятичные ASCII-числа (ASCII — American Standard Code for Information Interchange —
американский стандартный код для информационного обмена) — в одном байте содержится одноразрядное десятичное число, представленное его ASCII-кодом от 30h до 39h для цифр от О до 9 (старшая тетрада содержит код 00U );
Независимо от формата представления чисел ALU при выполнении команд сложения, вы читания, умножения и деления производит над ними операции как над двоичными кодами. По этому для получения правильного результата при использовании трех последних типов чисел нужно выполнять специальные команды коррекции.
Команда NEG dst. Эта команда используется для изменения знака числа, представленного в дополнительном коде. Команда выполняет операцию:
dst <г- 0 - dst