1302
правки
Изменения
→Команды
==Команды=Обзор команд =
== Команды загрузки==
mov -- команда загрузки.
mov al, 5 -- загрузить в al 5
В квадратных скобках при использовании 32-битных регистров позволено писать довольно много разных вещей:
любой из регистров общего назначения + (любой из регистров общего назначения, за исключением esp)*(1|2|4|8) +(-) offset (32-битное число)
== Работа со стеком ==
push eax -- положить eax на стек.
*Начало второй лекции. Начало пропущено:*
add eax, ebx (; eax += ebx) adc (???)eax, ebx ; eax += ebx + CF // CF - флаг переноса
sub / sbb
mul / div
imul ecx, ebx, 5 == ecx = ebx * 5
inc и dec. принимают один операнд, увеличивают (уменьшают) его на один; не трогают знак флаг переноса
Команда, которая неизвестно для чего изначально нужна.
lea (load effective adress):
lea eax, [ebx+ecx] -- ; фактически, трёхоперандное сложение. eax = abx + ecx
lea eax, [ebx+ebx*4] -- ; eax = ebx * 5 (yasm поддерживает запись вида lea eax, [ebx*5], но по стандарту так нельзя)
Как быстрее всего умножить число на 10?
add eax, eax
== Команды логики:==
and, or, xor, not. Все, кроме not -- унарные.
test eax,eax -- самый короткий способ проверить, 0 ли регистр
== Команды сдвига:==
Во всех сдвигах последний сдвигаемый бит идёт в cf
ebx,eax двигаются на 3 вправо (О_О). первые k (где k -- третий аргумент) битов того, что указано в первом аргументе == последние k того, что указано во втором.
=== Команды вращения (о_О):===
rol, ror: тупое вращение по кругу, ничего ниоткуда не берётся, не теряется и не придумывается.
rcl, rcr:
v-------------------------------->
Аналогично rol/ror'у, но флаг cf -- часть того, что сдвигается (т.о., сдвигаются 33 байтабита)
== Команды передачи управления:==
jmp метка (jmp eax)
ret x ~=
pop eip
add esp, x (; выкинуть со стека x байт)
//пара команд, которые все любят
nop -- Команда, Которая Ничего Не Делает
ud2 -- Команда, Которой Не Существует. Если она выполняется, программа падает с ошибкой. И БУДЕТ ПАДАТЬ. ВСЕГДА. И НЫНЕ. И ПРИСНО. ВО ВЕКИ. ВЕКОВ