Изменения

Перейти к: навигация, поиск

Участник:GeraltFromRivia/Лекция асм 02

4548 байт добавлено, 15:23, 28 июня 2012
Новая страница: «Сегодня по плану у нас обзор команд, "ret" это хорошо, но мало. У архитектуры x86 есть 8 различ...»
Сегодня по плану у нас обзор команд, "ret" это хорошо, но мало.
У архитектуры x86 есть 8 различных регистров, которые являются сокращениями выполняемых ими действий:
eax, ebx, ecx, edx, ebp, esp, esi, edi.
hint: esp<... stack pointer> вообще его не трогают, поэтому по факту есть 7 регистров.
eip - мы можем читать, но не можем в него писать.
eflags - регистор флажков(флагов много, но полезных для нас мало), нужные только:
zf<zeroflag>(после выполнения операции и получаем нолу, флаг нуля становится 1);
cf<carryflag>(следит за переполнением)
sf<signflag>(следит за главным битом числа - знаком)
df<... flag>(флаг направления - нужен для строковых операций)
все регистровые операции 32х битные.
Чтобы сильно не путаться, мы будем рассматривать 32х битный "мир"(если мы будем менять регистр ах<16 бит>, то будут изменяться только первые 16 бит у еах).
- можно разбить ах на два подрегистра - al и ah(по 8 бит)
Одна из значимых команд для пересылки данных это "mov"
Еще есть команды "movzx"(расширяет нулями) и "movsx"(расширяет знаками)
Команды условной загрузки позволяют одним регистрам загрузить значения другого регистра "movcc"
Из загрузок у нас есть еще команда "xchg" - swap значений 2х регистров
Команда "bswap" заменяет порядок следования байтов, так сказать замена BigEndian на LittleEndian и наоборот.
hint: LE немного удобнее, например каст int to char получается задаром (smile)
Доп две команды "push" и "pop" - вставить на стэк, и вытащить из стека.
Malloc и free можно использовать и в ассемблере.
Еще парочка комманд: "pusha" и "popa", кто не понял:
< popa(d) = popad >

ПРИМЕРbI:
MOV al, 5
MOV cx, dx
MOVZX eax, bl
MOVSX ..., ...
MOVcc ..., ...
XCHG eax, ebx
PUSH eax
POP eax

//==============================================================================
MUL ebx
edx:eax = eax + OP
DIV ebx
eax = edx:eax / OP
edx = edx:eax % OP
runtimeerror 200 = divizion by zero(на самом деле прога на ноль не делит, поэтому перед делением лучше обнулить edx)
hint: если не понятно - почитайте doc.
Две эквивалентные формулы:
imul ecx, ebx <=> ecx *= ebx
imul ecx, ebx, 5 <=> ecx = ebx * 5

ADD eax, ebx <=> eax += ebx

INC и DEC команды инкремента и декремента
hint: эти команды не трогают флаг переноса, по сравнению с операциями сложениями и вычитания
INC eax

LEA eax, [ebx + ecx] <=> eax = ebx + ecx
LEA eax, [ebx * 5] <=> LEA eax, [ebx + ebx * 4]

Еще у нас есть команды логики:
AND / OR / XOR / NOT
XOR eax, eax (быстрое обнуление)

CMP - команда сравнения(compare)

странные команды - TEST, SUB, SHRD, SHLD, ROR, ROL, label:
TEST eax, eax

команды сдвига - SHR / SHL <=> >>, <<
SHR eax, 2 (быстрое деление на 4)
Циклические сдвиги - RCL, RCR

Переход по... - JMP

команда вызова функции: CALL, RET
Call <=>
Ret <=>

NOP - команда которая ничего не делает
UD2 - команда, которая всегда завалит программу(такой команды определенно нет)
189
правок

Навигация