Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 8 октября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Ассемблер: памятка программиста

Автор: Кирилл / KKC-OS.RU
Это скорее памятка, которая расчитана на людей, 
знакомых с C++ или другим языком программирования 
высокого уровня, которые хотят быстро изучить 
ассемблер для написания высокоэффективных 
алгоритмов в составе своих программ 
или для иных целей (например для изучения программ 
в отладчике/дизассемблере).

Ассемблер - это язык низкоуровневого программирования, 
где каждый оператор соответствует команде процессора. 
Рассмотрим синтаксис этого языка. 

Каждый оператор записывается на новой строке. 
Возможен пропуск строк и вставка пробельных символов, 
они просто игнорируются. Комментарии должны начинаться 
символом ';' и заканчиваться символом новой строки.

; комментарий на отдельной строке
var1db "b" ;	 переменная var1 из 1го байта со значением 'b'
db "abcd";	 просто следующий набор байтов (строка)
var2dw 121;	 переменная var2 из 2х байт со значением 121
var3dd -0xFFFF;	 переменная var3 из 4х байт со значением -FFFF (16-чная система)
arraydb 99 dup 0;массив array из 99 байтов со значениями 0
v_64dq ?;	 переменная v_64 из 8 байтов, значение не определено

array2 db 20 dup (5 dup "a") ;строка array2 из 100 символов 'a' (20*5*1)

В данном примере использовались директивы ассемблера, 
резервирующие память, а именно 
db - 8 бит, dw - 16 бит, dd - 32 бита и dq - 64 бита.

В операторах могут использоваться как ячейки памяти, 
так и регистры, которые представляют собой ячейки 
быстродействующей памяти в процессоре.
Основные регистры-это eax, ebx, ecx и edx , также 
часто используются регистры ebp, esi, edi и esp, 
каждый по 32 бита, причём младшие 16 бит именуются 
без префикса 'e', а младшие и старшие байты 
из этих 16 бит именуются суффиксами 'l' и 'h' соответственно 
(ax - 0-15 ,биты eax,al - 0-7 биты ax, ah - 8-15 биты ax). 

Также в процессоре имеется регистр флагов, биты которого 
устанавливаются при выполнении команд. Наиболее часто используются 
флаги o, c, s, d и z. Флаг o устанавливается, если знаковый результат 
вне диапазона (переполнение), c - при беззнаковом переполнении и 
используется как флаг переноса. Во всех операциях сдвигов и 
вращений в него копируется выталкиваемый или переносимый бит. 
Флаг s означает отрицательный результат, а флаг z - нулевой. 
Эти два флага устанавливаются всеми арифметическими и логическими 
операциями кроме умножения, деления и вращения. Флаг d устанавливает 
направление приращения указателей в строковых операциях. 

Основные операторы можно разделить на несколько основных групп: 
операторы пересылки, логических и арифметических операций, 
сравнения и условных переходов, безусловных 
переходов и управления флагами.
Операции с вещественными числами - это тема совсем другой статьи.

     mov x,y
Пересылка y в x, например:
mov ax, 0xFF
mov bx, ax
mov var_2, bx
     lea x,y
Загружает в x адрес y,
почти тоже, что mov x, offset y; или mov x, y;
если y задано как сумма регистров в квадратных скобках,
например:
lea eax, var_1
lea ebx, [ebp+esi]
     add x,y
Сложение x=x+y, например:
mov ax, -1
add ax, 10 ;ax=9
     sub x,y
Вычитание x=x-y, например:
mov ax,10
mov bx,100
sub bx, ax ;bx=90
     inc x
Увеличение x на 1, например:
mov var_1, 1
inc var_1 ;var_1=2
     dec x
Уменьшение x на 1, например:
mov var_2, 0xFF
dec var_2 ; var_2=0xFE
     neg x
Арифм. инверсия x=-x, например:
mov ax, 0xFF
mov bx, 0xFF
neg ax
add ax, bx ;ax=0
     mul x / imul .x
Умножение на x,
Операнд		Множитель	Результат
1 байт		al		ax
2 байта		ax		dx:ax
4 байта		eax		edx:eax
При этом под dx:ax и edx:eax понимается, что старшая часть
результата помещается в dx/edx, а младшая - в ax/eax.
Команда imul может работать с отрицательными
(знаковыми) числами. Пример:
varx dw 10
mov ax, 65025 ;ax=255*255
mul varx
; AX=60426 DX=9, 60426+9*2^16=650250=255*255*10
     div x / idiv .x
Деление на x
Операнд	Делимое        Частное        Остаток
1 байт	ax		al		ah
2 байта	dx:ax		ax		dx
4 байта	edx:eax  	eax      	edx
При этом под dx:ax и edx:eax понимается, что
старшая часть делимого берётся из dx/edx, а
младшая - из ax/eax. Команда idiv может работать
с отрицательными (знаковыми) числами,
при этом знак остатка равен знаку делимого. Пример:
varx dw
mov ax,0
mov dx,1 ;dx:ax=256
div 3
;AX=85, DX=1, 85*3+1=256
Логические и поразрядные операции
Использование   	Название			Эквивалент C
and x,y   		"логическое и"			x=x&y
or x,y   		"логическое или"		x=x|y
xor x,y   		"исключающее или"		x=x^y
not x   		"логическое не"			x=!x
shl x,(cl,[0-31])  	"логический сдвиг влево"	x<<[0-31] 
shr x,(cl,[0-31])  	"логический сдвиг вправо"	x>>[0-31] 
sal x,(cl,[0-31])  	"арифмет. сдвиг влево"		signed x<<[0-31] 
sar x,(cl,[0-31])  	"арифмет. сдвиг вправо"		signed x>>[0-31] 
rol x,(cl,[0-31])  	"логическое вращение влево"	x=_rotl(x,[0-31])
ror x,(cl,[0-31])  	"логическое вращение вправо"	x=_rotr(x,[0-31])
rcl x,(cl,[0-31])  	"арифмет. вращение влево"	??????????
rcr x,(cl,[0-31]) 	"арифмет. вращение вправо"	??????????
test x,y   		"тест на ноль лог. И x, y"	if(x&y==0)
Команды переходов и сравнений
     cmp x,y
Сравнивает x и y
test x или test x, x
Проверяет на 0
     j<xx> x
Условный переход на адрес x, если:
ИспользованиеКлючУсловие или флаг
Использование	Ключ			Условие или флаг
ja x		Above			>	беззнаковые числа
jae x		Above or Equal		>=	беззнаковые числа
jb x		Below			<	беззнаковые числа
jbe x		Below or Equal		<=	беззнаковые числа
jc x		Carry			c==1 (shr,shl,sar,sal,ror,rol…)
jcxz x		CX is Zero		cx==0
je x		Equal			==
jz x		Zero			==0 
js x		Sign			<0 
jg x		Greater			>	числа со знаком
jge x		Greater or Equal	>=	числа со знаком
jl x		Less			<	числа со знаком
jle x		Less or Equal		<=	числа со знаком

Для каждого условия <xx> есть обратное условие < <n>xx>,
например jnbe - переход по условию "не (меньше либо равно)",
т.е. "больше". Пример применения:
mov ax,1
dec ax
test ax
jnz st1;>---------------------------*
inc ax;если ax==0 то ax++          |
st1:;обозначение адреса перехода |
mul 10;<---------------------------*
     JMP X
Условный переход на x, например:
jmp noblablabla
bla db "blablablablablablabla"
noblablabla:
mov eax, offset bla
     call x
Вызов функции x с последующим продолжением операций,
например:
call function
mov ax,bx  ;просто так
     ret x
Возврат из функции, при этом будет снято x байтов стека.
     puch x
Положить на вершину стека x,
например:
mov ax, 10
puch ax
puch 15
Как указатель стека используется регистр sp/esp.
     pop x
Снять с верхушки стека и положить в x, например:
pop ax ;ax=15
pop bx ;bx=10
Команды управления флагами:
Использование	Действие	Название
clc			с=0		сброс флага переноса
cld			d=0		сброс флага направления
stc			c=1		установка флага переноса в 1
std			d=1		установка флага направления в 1
  


Страницы книги разрезаны по 70Кб, чтобы они не были гигантскими и недолго грузились, так что нажмите "Далее" чтобы читать дальше.
Назад  Далее

Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS