1679
правок
Изменения
Новая страница: «x86 — Регистры 8 регистров общего назначения eax, ebx, ecx, edx, ebp, esp, esi, edi esp — адрес вершины стек...»
x86 — Регистры
8 регистров общего назначения
eax, ebx, ecx, edx, ebp, esp, esi, edi
esp — адрес вершины стека
eip — instruction pointer, указывает адрес выполняемой команды (следующей за ней). Можно косвенно изменять через команды перехода.
eflags — набор битовых флоагов. Полезные флаги:
zf — Если в рез-то получается 0, он устанавливается, не 0 — сбрасывается.
cf — Флаг переноса
sf — флаг знака, равный старшему биту рез-та.
df — флаг направления выполнения строковых операций
Все e-регистры — 32хбитные.
ax, bx — 16-битные.
r-регистры — 64 битные.
На 64 бит — rax.
rax = 32 бит + eax
eax = 16 бит + ax
ax = ah + al
Команды
Работают справа налево
mov al, 5
mov cx, di
movzx eax, bl
movzx — расширяет нулями
movsx — расширяет знаковым битом
mov_cc — условная загрузка
xchg (exchange) — swap
bswap — меняет порядок байтов на обратный
little-endian — младший байт пишется первым
big-endian — старший байт пишется первым
x86 — little-endian
machine-endian, native-endian
good-endian (little)
bad-endian (big)
Сетевые протоколы — big-endian.
Можно обращаться к памяти, [] — косвенная адресация.
mov eax, [abx]
mov [eax], abx.
В команде может быть только одно обращение к памяти.
16битные — [[bx|bp] + [si|di] + offset]
32х-быитные — [[все регистры общ.назн] + [рег общ.назн кроме esp] * [1| 2| 4| 8] + 32хбитное смещение]. За арифм. операции не считаются.
esp означает, что на 2 месте — нет регистра.
Читаем по очереди байты и записываем.
Работа со стеком.
push eax
pop eax
esp указывает на стек.
push — esp переместится вниз.
sub esp 4
mov sep eax
Правило — делать так, чтобы esp был кратен длине машинного слова.
pusha / pushad — загружает состояние всех восьми стеков.
popa / popad — заргужается только семь.
Арифм. операции.
add
adc
sub, sbb
mul, div — без знака
imul, idiv — со знаком
mul arg
edx, eax = eax * arg
div arg
eax = edx eax / arg
edx = edx eax % arg
Деление на 0 — если не обработать, программу убъет система.
Следать, чтобы в edx не было треша!
imul ecx, ebx — ecx *= ebx
imul ecx, ebx, 5 — ecx = ebx * 5
inc eax
dec eax
inc и dec не устанавливают флаг переноса!
lea eax, [ebx + ecx] — считает адрес второго операнда и записывает в первый.
lea eax, [ebx + ebx * 4]
and/or/xor/not
xor eax, eax — обнуление регистра
cmp / test
sub / and
test eax, eax — проверка на 0, пишет флаг
cmp — синтаксис как у sub
shr, shl
shr eax, 2
либо на константу, либо cl.
sar, sal — сдвиг вправо со знаком.
shrd, shld — сдвиги двойной точности.
shrd eax, ebx, 3 wtf????
ror
jmp метка, либо eax
jz
jnz
jc
jnc
ja — above
jb — below
jae == jnb
jbe
jl
je
jle
call label — синтаксис как jump
push eip
jmp label
ret
pop eip
nop — ничего не делает
8 регистров общего назначения
eax, ebx, ecx, edx, ebp, esp, esi, edi
esp — адрес вершины стека
eip — instruction pointer, указывает адрес выполняемой команды (следующей за ней). Можно косвенно изменять через команды перехода.
eflags — набор битовых флоагов. Полезные флаги:
zf — Если в рез-то получается 0, он устанавливается, не 0 — сбрасывается.
cf — Флаг переноса
sf — флаг знака, равный старшему биту рез-та.
df — флаг направления выполнения строковых операций
Все e-регистры — 32хбитные.
ax, bx — 16-битные.
r-регистры — 64 битные.
На 64 бит — rax.
rax = 32 бит + eax
eax = 16 бит + ax
ax = ah + al
Команды
Работают справа налево
mov al, 5
mov cx, di
movzx eax, bl
movzx — расширяет нулями
movsx — расширяет знаковым битом
mov_cc — условная загрузка
xchg (exchange) — swap
bswap — меняет порядок байтов на обратный
little-endian — младший байт пишется первым
big-endian — старший байт пишется первым
x86 — little-endian
machine-endian, native-endian
good-endian (little)
bad-endian (big)
Сетевые протоколы — big-endian.
Можно обращаться к памяти, [] — косвенная адресация.
mov eax, [abx]
mov [eax], abx.
В команде может быть только одно обращение к памяти.
16битные — [[bx|bp] + [si|di] + offset]
32х-быитные — [[все регистры общ.назн] + [рег общ.назн кроме esp] * [1| 2| 4| 8] + 32хбитное смещение]. За арифм. операции не считаются.
esp означает, что на 2 месте — нет регистра.
Читаем по очереди байты и записываем.
Работа со стеком.
push eax
pop eax
esp указывает на стек.
push — esp переместится вниз.
sub esp 4
mov sep eax
Правило — делать так, чтобы esp был кратен длине машинного слова.
pusha / pushad — загружает состояние всех восьми стеков.
popa / popad — заргужается только семь.
Арифм. операции.
add
adc
sub, sbb
mul, div — без знака
imul, idiv — со знаком
mul arg
edx, eax = eax * arg
div arg
eax = edx eax / arg
edx = edx eax % arg
Деление на 0 — если не обработать, программу убъет система.
Следать, чтобы в edx не было треша!
imul ecx, ebx — ecx *= ebx
imul ecx, ebx, 5 — ecx = ebx * 5
inc eax
dec eax
inc и dec не устанавливают флаг переноса!
lea eax, [ebx + ecx] — считает адрес второго операнда и записывает в первый.
lea eax, [ebx + ebx * 4]
and/or/xor/not
xor eax, eax — обнуление регистра
cmp / test
sub / and
test eax, eax — проверка на 0, пишет флаг
cmp — синтаксис как у sub
shr, shl
shr eax, 2
либо на константу, либо cl.
sar, sal — сдвиг вправо со знаком.
shrd, shld — сдвиги двойной точности.
shrd eax, ebx, 3 wtf????
ror
jmp метка, либо eax
jz
jnz
jc
jnc
ja — above
jb — below
jae == jnb
jbe
jl
je
jle
call label — синтаксис как jump
push eip
jmp label
ret
pop eip
nop — ничего не делает