Матрица представляет собой прямоугольную сетку, напичканную опокодами инструкций. По вертикали откладывается старший полубайт, а по горизонтали младший. Допустим, нас интересует какая инструкция соответствует машинной команде 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.
|
символ |
команда |
опкод |
|
& |
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 |