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