Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Регистры общего назначения - eax, ebx, ecx, edx (ax, bx, cx, dx, al, bl, cl, dl, ah, bh, CH, DH).

Поиск

Регистры сегментов - это CS, DS, ES, FS, GS, SS. Эти регистры 16-ти битные, и содержат в себе первую половину адреса "сегмент:оффсет".

Регистры оффсета - EIP, ESP, EBP, ESI, EDI (IP, SP, BP, SI, DI).

EIP - указатель команд, и содержит указатель на линию кода, которая будет исполняться следующей. Полный адрес на следующую исполняемую линию кода будет CS:IP (CS:EIP).

Регистр ESP указывает на адрес вершины стека. Регистр ЕВР содержит адрес, начиная с которого в стек вносится или забирается информация (или "глубина" стека).

 


Регистры процессора

Битность процессора напрямую связана с битностью регистров и их аббревиатурой, поэтому:

AX, CX, SP, IP,... - харакетризуют 16 битные регистры;EAX, ECX, ESP, EIP,... - 32 битные;RAX, RCX, RSP, RIP,... - 64 битные (добавляется буква R);

Существуют следующие типы регистров:

· Регистры общего назначения (РОН) - EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP

· Регистр-указатель команд - EIP

· Регистр флагов - EFL (EFLAGS)

· Сегментные регистры - SS, CS, DS, ES


Описание регистров

Регистры общего назначения (РОН) служат для хранения промежуточных вычислений.

1) RAX, RCX, RDX, RBX, RSP, RBP, RSI, RDI, R8 - R15 — 64-битные;

2) EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI, R8D - R15D — 32-битные;

3) AX, CX, DX, BX, SP, BP, SI, DI, R8W - R15W — 16-битные;

4) AH, AL, CH, CL, DH, DL, BH, BL, SPL, BPL, SIL, DIL, R8B - R15B — 8-битные;

где x - 8..15.

Регистры RAX, RCX, RDX, RBX, RSP, RBP, RSI, RDI, Rx, RxD, RxW, RxB, SPL, BPL, SIL, DIL доступны только в 64-битном режиме работы процессора.


Задача: найти старшую часть расширенного регистра (eax, ebx,..., esi, edi)?

 

1) Например надо найти старшую часть регистра esi и поместить ее в ax:

mov eax, esi <--- Помещаем esi в eaxshr eax, 10h <--- Сдвигаем биты eax на 16 разрядов вправо.

 

2) Например надо найти старшую часть регистра ebx. Для этого пишем:

rol ebx, 10h

После этого все разряды регистра ebx сдвинутся по кругу на 16 позиций вправо. Старшие 16 разрядов окажутся на месте младших 16 разрядов. А младшие 16 разрядов окажутся на месте старших.


Первая программа под WIN32. Программа "Hello, World!".

.386

.model flat, stdcall

extrn ExitProcess:PROC

extrn MessageBoxA:PROC

.data

Ttl db "First ASSEMBLER program",0h

Msg db 'Hello, World!!!!',0h

.code

start:

push 0h

push offset Ttl

push offset Msg

push 0h

call MessageBoxA

push 0h

call ExitProcess

endstart

 

Первая программа под DOS16.

masm

model small

.stack 100h

.data

message db "Hello World!!!",'$'

.code

begin:

xor ax,ax; Обнуление регистра Ах

mov ax,@data;Установка в ds адреса сегмента

mov ds,ax;данных

mov ah,09h;Функция Dos вывода сообщения

mov dx,offset message;запись смещения message в dx

int 21h;Функция Dos вывода сообщения на экран

mov ax,4c00h;Функция DOS- выход из программы

int 21h;Вызов DOS. Останов программы.

end begin


Лекция №2. КомандыPUSH, POP. Пересылка данных. Регистры архитектуры x86. Регистры флагов. Данные и операнды языка Ассемблер.

API функции находятся в библиотеках kernel32.dll, user32.dll, gdi32.dll (классика) advapi32.dll и т.д. kernel32.dll – эта библиотека есть в каждом процессе. Все функции, используют модель вызова stdcall, это значит, параметры подпрограмме передаются "задом-на-перёд" и вызываемый очищает стек. Общий вид вызова API функции будет такой:

Push параметр 3

Push параметр 2

Push параметр 1

Call функция;

 

Каждая программа в Win32 в конце своего выполнения ОБЯЗАТЕЛЬНО должна вызвать функцию ExitProcess. Функуия ExitProcess имеет вид:

VOID ExitProcess(

UINT uExitCode // exit code for all threads

);

uExitCode - это значение никогда не используется и всегда равно 0.

 

Функция MessageBox имеет вид:

Int MessageBox(

HWND hWnd, // handle родительского окна

LPCTSTR lpText, // address of text in message box

LPCTSTR lpCaption, // address of title of message box

UINT uType // style of message box

);

 


При обращении к функциям и процедурам могут использоваться различные способы передачи их параметров:

Передача параметров при вызове функций может производится через стек или регистры процессора.

Помещаемые в стек или регистр параметры могут следовать в различном порядке.

После передачи параметров стек может очищаться либо вызывающим процессом либо вызываемой процедурой.

Соглашение о вызовах – это способ передачи параметров в вызываемую функцию или процедуру.

 

Таблица 1. Директивы соглашения о вызовах


Сегментация в DOS

В ДОС и в первоначальных версиях Windows память была сегментной. Вся память делилась на сегменты по 64 КВ., и адрес задавался, форматом сегмент:офсет. Сегмент задаёт порядковый номер сегмента, а офсет задаёт смещение чего-либо в этом сегменте.

Память
Сегмент 1 (64kb) Сегмент 2 (64kb) Сегмент 3 (64kb) Сегмент 4 (64kb) и так далее

 

С помощью 16 бит можно адресовать только 65536 байт памяти и 65536 сегментов.

 

Например:

Всё шестнадцатиричное)

Это означает: сегмент 30, смещение 4012. Чтобы узнать, что находится по этому адресу, сначала необходимо перейти на сегмент 30, а затем в сегменте сместиться на 4012.

Сегментные регистры:

CS - Сегмент кода

DS - Сегмент данных

SS - Сегмент стека

ES - Дополнительный сегмент

FS - Универсальный сегмент

GS - Универсальный сегмент

 




Поделиться:


Последнее изменение этой страницы: 2016-09-13; просмотров: 4793; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.218.99.80 (0.008 с.)