Лекция по ассемблеру 3 марта — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м (rollbackEdits.php mass rollback)
 
Строка 1: Строка 1:
{| class="wikitable" align="center" style="color: red; background-color: black; font-size: 56px; width: 800px;"
+
x86 — Регистры
|+
 
|-align="center"
 
|'''НЕТ ВОЙНЕ'''
 
|-style="font-size: 16px;"
 
|
 
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.
 
 
 
Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием.
 
 
 
Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей.
 
 
 
Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить.
 
 
 
''Антивоенный комитет России''
 
|-style="font-size: 16px;"
 
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.
 
|-style="font-size: 16px;"
 
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].
 
|}
 
 
 
x86 — Регистры
 
 
8 регистров общего назначения
 
8 регистров общего назначения
 
eax, ebx, ecx, edx, ebp, esp, esi, edi
 
eax, ebx, ecx, edx, ebp, esp, esi, edi
Строка 29: Строка 8:
 
eflags — набор битовых флоагов. Полезные флаги:
 
eflags — набор битовых флоагов. Полезные флаги:
 
     zf — Если в рез-то получается 0, он устанавливается, не 0 — сбрасывается.
 
     zf — Если в рез-то получается 0, он устанавливается, не 0 — сбрасывается.
     cf — Флаг переноса
+
     cf — Флаг переноса
     sf — флаг знака, равный старшему биту рез-та.
+
     sf — флаг знака, равный старшему биту рез-та.
     df — флаг направления выполнения строковых операций
+
     df — флаг направления выполнения строковых операций
  
Все e-регистры — 32хбитные.
+
Все e-регистры — 32хбитные.
 
ax, bx — 16-битные.
 
ax, bx — 16-битные.
 
r-регистры — 64 битные.
 
r-регистры — 64 битные.
  
На 64 бит — rax.
+
На 64 бит — rax.
 
rax = 32 бит + eax
 
rax = 32 бит + eax
 
eax = 16 бит + ax
 
eax = 16 бит + ax
Строка 51: Строка 30:
 
movzx eax, bl
 
movzx eax, bl
 
movzx — расширяет нулями
 
movzx — расширяет нулями
movsx — расширяет знаковым битом
+
movsx — расширяет знаковым битом
  
mov_cc — условная загрузка
+
mov_cc — условная загрузка
xchg (exchange) — swap
+
xchg (exchange) — swap
  
 
bswap — меняет порядок байтов на обратный
 
bswap — меняет порядок байтов на обратный
Строка 66: Строка 45:
 
bad-endian (big)
 
bad-endian (big)
  
Сетевые протоколы — big-endian.
+
Сетевые протоколы — big-endian.
  
 
Можно обращаться к памяти, [] — косвенная адресация.
 
Можно обращаться к памяти, [] — косвенная адресация.
Строка 84: Строка 63:
  
 
esp указывает на стек.
 
esp указывает на стек.
push — esp переместится вниз.
+
push — esp переместится вниз.
 
     sub esp 4
 
     sub esp 4
 
     mov sep eax
 
     mov sep eax
Строка 90: Строка 69:
  
  
pusha / pushad — загружает состояние всех восьми стеков.
+
pusha / pushad — загружает состояние всех восьми стеков.
 
popa / popad — заргужается только семь.
 
popa / popad — заргужается только семь.
  
Строка 100: Строка 79:
 
sub, sbb
 
sub, sbb
  
mul, div — без знака
+
mul, div — без знака
 
imul, idiv — со знаком
 
imul, idiv — со знаком
  
Строка 112: Строка 91:
 
Следать, чтобы в edx не было треша!
 
Следать, чтобы в edx не было треша!
  
imul ecx, ebx — ecx *= ebx
+
imul ecx, ebx — ecx *= ebx
imul ecx, ebx, 5 — ecx = ebx * 5
+
imul ecx, ebx, 5 — ecx = ebx * 5
  
 
inc eax
 
inc eax
Строка 119: Строка 98:
 
inc и dec не устанавливают флаг переноса!
 
inc и dec не устанавливают флаг переноса!
  
lea eax, [ebx + ecx] — считает адрес второго операнда и записывает в первый.
+
lea eax, [ebx + ecx] — считает адрес второго операнда и записывает в первый.
 
lea eax, [ebx + ebx * 4]
 
lea eax, [ebx + ebx * 4]
  
Строка 128: Строка 107:
 
cmp / test
 
cmp / test
 
sub / and
 
sub / and
test eax, eax — проверка на 0, пишет флаг
+
test eax, eax — проверка на 0, пишет флаг
 
cmp — синтаксис как у sub
 
cmp — синтаксис как у sub
  
Строка 138: Строка 117:
 
sar, sal — сдвиг вправо со знаком.
 
sar, sal — сдвиг вправо со знаком.
  
shrd, shld — сдвиги двойной точности.
+
shrd, shld — сдвиги двойной точности.
 
shrd eax, ebx, 3 wtf????
 
shrd eax, ebx, 3 wtf????
  

Текущая версия на 19:15, 4 сентября 2022

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 — ничего не делает