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