В командах, использующих непосредственный операнд, признак s вместе с признаком w определяет разрядность непосредственного операнда, записываемого в команде, и разрядность выполняемой операции согласно табл. 6.3.
Таблица
6.3.
w |
s |
Операция |
Непосредственный операнд |
0 |
0 |
8-разрядная |
8-разрядный |
0 |
1 |
не используется |
1 |
0 |
16-разрядная |
16-разрядный |
1 |
1 |
8-разрядный, расширяемый знаком до 16-ти разрядов при выполнении операции |
Изменение естественного порядка выполнения команд программы осуществляется с помощью команд передачи управления. К ним относятся команды переходов, циклов, вызова подпрограммы и возврата из нее, а также некоторые другие. Мы рассмотрим лишь первые две группы команд.
Классификация команд переходов в персональной ЭВМ представлена на рис. 6.2.
Рис.
6.2.
Классификация команд переходов IBM PC
Физический адрес выполняемой команды определяется содержимым указателя команд IP и сегментного регистра команд CS. Команды, меняющие значение обоих этих регистров, называются командами межсегментных переходов, а меняющие только значение IP, - командами внутрисегментных переходов.
Команды безусловных переходов производят модификацию регистра IP или регистров IP и CS без предварительного анализа каких-либо условий. Существует пять команд безусловных переходов. Все они имеют одинаковую мнемонику JMP и содержат один операнд. Конкретный формат команды определяется соответствующим префиксом и приведен в общей таблице машинного представления команд (табл. 6.4).
Таблица
6.4.
Машинные коды некоторых команд
Команда |
Байты кода команды |
Схема операции |
байт 1 |
байт 2 |
байты 3…6 |
ADD |
000000dw |
md reg r/m |
(disp8/16) |
r(r/m) = r + r/m |
|
100000sw |
md 000 r/m |
(disp8/disp16)d8/16 |
r/m = r/m + d8/16 |
|
0000010w |
data L |
(data H) |
ac = ac + d8/16 |
SUB |
001010dw |
md reg r/m |
(disp8/16) |
r(r/m)=r(r/m)-(r/m)r |
|
100000sw |
md 101 r/m |
(disp8/16)d8/16 |
r/m = r/m - d8/16 |
|
0010110w |
data L |
(data H) |
ac = ac - d8/16 |
AND |
001000dw |
md reg r/m |
(disp8/16) |
r(r/m) = r & r/m |
|
100000sw |
md 100 r/m |
(disp8/16)d8/16 |
r/m = r/m & d8/16 |
|
0010010w |
data L |
(data H) |
ac = ac & d8/16 |
OR |
000010dw |
md reg r/m |
(disp8/16) |
r(r/m) = r V r/m |
|
100000sw |
md 001 r/m |
(disp8/16)d8/16 |
r/m = r/m V d8/16 |
|
0000110w |
data L |
(data H) |
ac = ac V d8/16 |
XOR |
001100dw |
md reg r/m |
(disp8/16) |
r(r/m) = r + r/m |
|
100000sw |
md 110 r/m |
(disp8/16)d8/16 |
r/m = r/m + d8/16 |
|
0011010w |
data L |
(data H) |
ac = ac + d8/16 |
MOV |
100010dw |
md reg r/m |
(disp8/16) |
r = r/m, r/m = r |
|
1100011w |
md 000 r/m |
(disp8/16)d8/16 |
r/m = d8/16 |
|
1011wreg |
data L |
(data H) |
reg = d8/16 |
|
1010000w |
disp L |
disp H |
ac=m ;прямой адрес |
|
1010001w |
disp L |
disp H |
m=ac ;прямой адрес |
CMP |
0011101w |
md reg r/m |
(disp8/16) |
r - r/m |
|
0011100w |
md reg r/m |
(disp8/16) |
r/m - r |
|
100000sw |
md 111 r/m |
(disp8/16)d8/16 |
r/m - d8/16 |
|
0011110w |
data L |
(data H) |
ac - d8/16 |
INC |
1111111w |
md 000 r/m |
(disp8/16) |
r/m = r/m+1 |
|
01000reg |
|
|
reg = reg+1 |
DEC |
1111111w |
md 001 r/m |
(disp8/16) |
r/m = r/m-1 |
|
01001reg |
|
|
reg = reg-1 |
TEST |
1000010w |
md reg r/m |
(disp8/16) |
r & r/m |
|
1111011w |
md 000 r/m |
(disp8/16)d8/16 |
r/m & d8/16 |
|
1010100w |
data L |
(data H) |
ac & d8/16 |
XCHG |
10010reg |
|
|
|
|
1000011w |
md reg r/m |
(disp8/16) |
|
JMP short |
11101011 |
disp L |
|
IP=IP+dispL |
near ptr |
11101001 |
disp L |
disp H |
IP=IP+dispH,L |
word ptr |
11111111 |
md 100 r/m |
(disp8/16) |
IP=(EA) |
far ptr |
11101010 |
IP-L |
IP-H,CS-L,CS-H |
IP=IPH,L, CS=CSH,L |
dword ptr |
11111111 |
md 101 r/m |
(disp8/16) |
IP=(EA), CS=(EA+2) |
Условный переход |
|
|
|
IP=IP+dispL, если условие выполнено,
иначе к след. команде |
JZ (JE) |
01110100 |
disp L |
|
ноль (равно) |
JNZ (JNE) |
01110101 |
disp L |
|
не ноль (не равно) |
JS |
01111000 |
disp L |
|
минус |
JNS |
01111001 |
disp L |
|
плюс |
JO |
01110000 |
disp L |
|
переполнение |
JNO |
01110001 |
disp L |
|
нет переполнения |
JL (JNGE) |
01111100 |
disp L |
|
меньше для чисел |
JNL (JGE) |
01111101 |
disp L |
|
не меньше для чисел |
JG (JNLE) |
01111100 |
disp L |
|
больше для чисел |
JNG (JLE) |
01111101 |
disp L |
|
не больше для чисел |
JB (JNAE,JC) |
01110010 |
disp L |
|
меньше для кодов |
JNB (JAE, JNC) |
01110011 |
disp L |
|
не меньше для кодов |
JA (JNBE) |
01110010 |
disp L |
|
больше для кодов |
JNA (JBE) |
01110011 |
disp L |
|
не больше для кодов |
JP (JPE) |
01111010 |
disp L |
|
четное число "1" |
JNP (JPO) |
01111011 |
disp L |
|
нечетное число "1" |
Примечание: в столбце "Схема операции" ac означает регистр-аккумулятор, в качестве которого используется регистр AX при w=1 и регистр AL при w=0.