Структура команд
Существует 2 формы представления машинных команд:
- исходный текст на ассемблере;
- бинарный код.
Команды на языке ассемблера содержат:
- символьный код операции,
- один или два операнда:
- левый задает адрес приёмника,
- правый - адрес источника,
- оба операнда заданы регистрами или только один,
- адресом к непосредственной памяти может быть только 1 операнд.
В некоторых командах операнды могут задаваться как "память-память":
- MOVS - команда копирования строки;
- работы со стеком, являющегося частью памяти.
Адрес ячейки памяти задается:
- прямым адресом (offset) или
- компонентами (B, X, disp),
где disp = "число" или disp = "число"+"числовая константа".
Примеры команд на уровне ассемблера:
mov ax, bx ;копирование в ax содержимого bx
mov ax, ds:offset 356 ;копирование в ax значения ячейки по смещению 356
mov ax, [СS:bх +356] ;копирование в ax значения ячейки из математического адреса СS:bх +356
mov ax, [bp +si+356] ;копирование в ax значения ячейки по адресу, равному сумме значений регистров bp, si и смещения 356
mov byte ptr z, 15 ;копирование числа 15 в ячейку памяти (размером в байт) по адресу z
Операнды можно записать:
1) ma[bx + di - 1000] = [bx + di + ma + (- 1000)]
2) bx[si - 511] = [bx + si + (- 511)]
где ma - числовая константа.
Машинная кодировка команд cpu i86
В CPU i86 используются команды переменной длины: 17 байт.
0-2 байта |
1 байт |
0,1 байт |
0-2 байта |
0-2 байта |
префикс |
код операции |
постбайт |
байты смещения (disp) |
непосред-ственный операнд |
Рис.5. Структура команд CPU i86 |
||||
Префикс
Используются 2 необязательных префикса:
- повторения;
- замены текущего сегмента памяти в команде.
Префикс повторения:
- для обработки вектора символов;
- повторение одинакового действия над каждым символом.
Количество повторений задается:
- регистром cx, уменьшаемым каждый раз на единицу,
- выполнением условия из регистра Flags.
Префикс замены сегмента памяти
Можно явно изменить используемый по умолчанию сегмент:
1) mov ax, [CS:bx +356]
- регистр bх по умолчанию работает с сегментом DS,
- но запись CS:bх указывает на работу с данными из сегмента CS;
2) mov ax, [ma + bх +356]
- в смещении адреса указан регистр bx (или bp),
- указывающий, что неявно используется сегмент DS (или SS),
- а переменная (ma) в смещении задана в другом сегменте (пусть в CS);
- префикс замены сегмента равен сегменту, в котором находится переменная.
Код операции
Является единственным обязательным элементом команды (1 байт).
-
Биты 0-4 (или 0-7)
Бит 5
Бит 6
Бит 7
Код команды
s
d
w
s=1 - расширение байта данных до слова в команде с 1-м аргументом
d=1 - адрес приёмника - регистр;
иначе - память
w=0 - размер операндов - байт;
w=1 - слово
Также возможны ситуации использования битов 5-7:
- не используются под флаги s, d, w (используются под код команды);
- используются в одноместной команде для задания номера РОНа с данными.
Постбайт:
- необязательная часть команды,
- задающая 1 или 2 адреса операндов,
- один из операндов является и адресом результата.
Постбайт (рис. 6) содержит 3 поля:
- md - поле режима адресации,
- r/r - поле номеров регистров,
- r/M - поле:
- номера регистра другого операнда или
- метода получения адреса памяти.
7 |
6 |
5 - |
3 |
2 - |
0 |
|
|
md |
r/r |
r/M |
|
||||
Рис. 6. Структура постбайта |
|||||||
Параметры постбайта
md |
Адресация |
Примечание по адресации |
Поле r/r |
Поле r/M |
00 |
регистр/память |
без смещения disp |
№ РОНа 1-го операнда |
№ метода вычисления адреса памяти одного из операндов |
01 |
регистр/память |
смещение в 1 байт в диапазоне [-128; 127] |
||
10 |
регистр/память |
смещение в 2 байта в диапазоне [-32768; 32767] |
||
11 |
регистр/регистр |
без использования памяти |
№ РОНа 2-го операнда |
При адресации "регистр/память" поле r/m описывает:
r/m |
Адресация ячейки памяти одного из операндов |
000011 |
адрес задается 3-мя компонентами: B, X и disp |
100111 |
адрес задается 2-мя компонентами: B и disp |
110 при md = 00 |
исключение: адрес задан прямым 2-х байтным смещением |
Табл.1. Формулы вычисления адресов по значениям полей постбайта |
|||||
Поле r/m |
Поле md |
||||
00 |
01 (disp в 1 байт) |
10 (disp в 2 байта) |
11 (другой аргумент - регистр) |
||
w = 0 |
w = 1 |
||||
000 |
DS:[bx + si] |
DS:[bx + si + disp] |
DS:[bx + si + disp] |
al |
ax |
001 |
DS:[bx + di] |
DS:[bx + di + disp] |
DS:[bx + di + disp] |
cl |
cx |
010 |
SS:[bp + si] |
SS:[bp + si + disp] |
SS:[bp + si + disp] |
dl |
dx |
011 |
SS:[bp + di] |
SS:[bp + di + disp] |
SS:[bp + di + disp] |
bl |
bx |
100 |
DS:[si] |
DS:[si + disp] |
DS:[si + disp] |
ah |
si |
101 |
DS:[di] |
DS [di + disp] |
DS [di + disp] |
ch |
di |
110 |
DS:[disp 2 байта] |
SS:[bp + disp] |
SS:[bp + disp] |
dh |
bp |
111 |
DS:[bx] |
DS [bx + disp] |
DS [bx + disp] |
bh |
bx |
0-1 байт |
1 байт |
0-1 байт |
0-2 байта |
0-2 байта |
|
||||
Префикс |
Код операции. |
Постбайт |
Disp |
data |
|
||||
|
|
|
|
|
|
||||
|
md |
r/r |
r/m |
|
|
|
|
||
|
2 бита |
3 бита |
3 бита |
|
|
|
|
||
Вариант базово-индексной адресации памяти |
|||||||||
если |
|
|
r/M ≤ 011 |
то - команда типа "регистр/память"; один операнд - в регистре, указанном полем r; адрес памяти другого операнда: (B)+(X)+ disp, где В и Х задаются кодом поля r/M. |
|||||
при: |
00 |
Disp - отсутствует |
|||||||
|
01 |
Disp = 1 байт |
|||||||
|
10 |
Disp = 2 байта |
|||||||
При |
11 |
Команда типа "регистр/регистр", операнды находятся в регистрах, указанными полями r/r и r/M. |
|||||||
Вариант относительно-индексной адресации памяти |
|
||||
если |
|
|
r/M ≥ 100, |
то команда типа "регистр/память"; один операнд - в регистре, указанном полем r; адрес памяти другого операнда: (B)+ Disp, где B задается кодом поля r/M. |
|
при |
00 |
Disp - отсутствует |
|||
|
01 |
Disp = 1 байт |
|||
|
10 |
Disp = 2 байта |
|||
|
|
|
|
||
При md=00 и r/M = 110 адрес задается прямым смещением в 2 байта |
|||||
Для адреса вида [bp] (mov [bp], 1): md=01 и cо смещением DispL=0 |
|||||
При указании в адресе bp используется сегмент SS; при bx - сегмент DS |
|||||
Рис.7. Структура команд CPU i86 в реальном режиме |
|||||
Числовое смещение, кроме случаев исключений, занимает размер:
- 1 байт, если оно в диапазоне [-128; 127];
- 2 байта, если оно в диапазоне [-32768; 32767];
- 2 байта, если в смещении задана переменная (ma, mb, bd, bk, wd, wk).
Размер данных (data) определяется:
- размером задающего их регистра (1 или 2 байта);
- директивой "Byte ptr" (1 байт) или "Word ptr" (2 байта) перед адресом (в скобках [ ]) - mov Word PTR [BX+DI], 140
- числовым значением data:
- 1 байт - в диапазоне [0; 255] → mov al, 128
- 2 байта - в диапазоне [0; 65535] → mov ax, 32760.
Если данные отрицательные, то нормируются верхним значением диапазона - числом 256 или 65536:
-7 = -7 + 256 = 249
