Матрица команд
Матрица представляет собой прямоугольную сетку, напичканную опокодами инструкций. По вертикали откладывается старший полубайт, а по горизонтали младший. Допустим, нас интересует какая инструкция соответствует машинной команде 41h. Откладываем по горизонтали 4x, откладываем по вертикали x1 и в точке их пересечения находит INC CX.
А теперь решим обратную задачу: по известной команде найдем соответствующей ей машинный код. Вот, например: PUSH SS. Находим такую инструкцию в таблице и видим, что она находится в клетке с координатами 1x:x6, значит, ее опкод 16h!
С однобайтовыми командами мы все понятно. Попробуем разобраться с остальными. В таблице видны сокращения: r/m, r8, r16. im8, im16. Что это? "im" это сокращения от "immediate", то есть "непосредственное значение" или "константа", а числа указывают на разрядность в битах. Вот, например, XOR AL,im8. Первый байт команды занимает опкод (34h), второй — непосредственное значение. В частности, XOR AL,69h будет выглядеть так: 34h 69h. А вот другой пример: ADD AX,im16h. Первый байт занимает опкод (05h), а два последних — непосредственное значение типа "слово", причем, младший байт располагается по меньшему адресу. Поэтому, ADD AX, 669h кодируется как 05h 69h 06h. Как видите, все предельно просто.
Сокращения r8 и r16 обозначают поля, кодирующие 8- и 16-разрядные регистры соответственно, а r/m ко всему прочему включает в себя еще и тип адресации, использующийся для доступа к памяти. Это довольно громоздка тема, даже поверхностное описание которой требует как минимум целой главы. И такая глава действительно включена в "Технику и философию хакерских атак", электронную версию которой можно найти на моем ftp-сервере (83.239.33.46). Она лежит в файле /pub/zq-disass.pdf. Добродушно настроенный The Svin проделал большую работу по поиску ошибок, которые водились там в большом числе и ходили косяками, за что ему большое спасибо. Список исправлений оформлен в виде независимого файла, который находится там же файле /pub/phck1.buglist.chm.
Подавляющая часть r/m и r8/16 сосредоточена в нечитабельных областях таблицы ASCII (т.е. имеет код либо меньше 20h, либо больше 7Fh), поэтому пользоваться ими нам практически не придется. Приятное исключение составляют команды типа: XXX [reg16],reg8/16 и XXX [BP+im8],reg8/16, да и то далеко не со всем набором регистров. Но об этом мы еще поговорим позже, а пока, уподобившись Кириллу и Мефодию, будет составлять Азбуку.
Все машинные команды можно разбить на три большие группы. К первой относятся однобайтовые команды, не имеющие никаких или практически никаких побочных эффектов. Они могут изменять значение регистров общего назначения или насиловать стек, но не должны лезть в порты, обращаться к памяти и т. д.
Вторую группу возглавляют двух или тех байтовые команды, один из операндов которых представляет собой непосредственное значение. Это очень важные команды, поскольку непосредственное значение позволяет кодировать те символы, которые не могут быть представлены командами первой группы. В частности, в нет символа пробела, без которого не обходится ни одна текстовая строка.
В третью группу попадают все остальные команды. Использовать их можно, но только с осторожностью. Короче говоря, первые две группы — это наш активный лексикон, а третья — заначка про запас.
Составленная нами азбука будет выглядеть так:
символ |
команда |
опкод |
& |
es: |
26h |
. |
DDA |
27h |
. |
CS: |
2Eh |
/ |
DAS |
2Fh |
? |
AAS |
3Fh |
@ |
INC AX |
40h |
[ |
POP BX |
5Bh |
\ |
POP SP |
5Ch |
] |
POP BP |
5Dh |
^ |
POP SI |
5Eh |
_ |
POP DI |
5Fh |
` |
PUSHA |
60h |
> |
DS: |
3Eh |
6 |
ss: |
36h |
7 |
AAA |
37h |
A |
INC CX |
41h |
a |
POPA |
61h |
B |
INC DX |
42h |
b |
BOUND |
62h |
C |
INC BX |
43h |
c |
ARPL |
63h |
D |
INC SP |
44h |
d |
FS: |
64h |
E |
INC BP |
45h |
e |
GS: |
65h |
F |
INC SI |
46h |
f |
size: |
66h |
G |
INC DI |
47h |
g |
addr: |
67h |
H |
DEC AX |
48h |
I |
DEC CX |
49h |
J |
DEC DX |
5Ah |
K |
DEC BX |
4Bh |
L |
DEC SP |
4Ch |
M |
DEC BP |
4Dh |
N |
DEC SI |
4Eh |
O |
DEC DI |
4Fh |
P |
PUSH AX |
50h |
Q |
PUSH CX |
51h |
R |
PUSH DX |
52h |
S |
PUSH BX |
53h |
T |
PUSH SP |
54h |
U |
PUSH BP |
55h |
V |
PUSH SI |
56h |
W |
PUSH DI |
57h |
X |
POP AX |
58h |
Y |
POP CX |
59h |
Z |
POP DX |
5Ah |