Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
прогр.docx
Скачиваний:
23
Добавлен:
21.12.2018
Размер:
2.58 Mб
Скачать

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

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

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 в eax

shr 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) передача параметров при вызове функций может производится через стек или регистры процессора.

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

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

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

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

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

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

Память

Сегмент 1

(64kb)

Сегмент 2

(64kb)

Сегмент 3

(64kb)

Сегмент 4

(64kb)

и так далее

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

Например: