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

Материал из Викиконспекты
Перейти к: навигация, поиск

Сегодня по плану у нас обзор команд, "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 - команда, которая всегда завалит программу(такой команды определенно нет)