Крок 6 - що таке регістри

Регістри це спеціальні осередки пам'яті. Це найголовніше. Вся їх принадність у тому, що звернення до регістрів проводитися значно швидше ніж до оперативної пам'яті ПК. Саме з цієї причини регістри використовуються для команд процесора. Від туди процесору зручно і швидко отримувати інформацію. Якщо говорити o ПК з типом процесорів 286. А ми поки саме такий процесор і розглядаємо то розмір регістра 16 біт. Кожен регістр має ім'я і своє призначення. Вони бувають такі за типами.

регістри загального призначення AX, BX, CX, DX, BP, SI, DI, SPcегментние регістри CS, DS, SS, ESсчетчік команд IPрегістр прапорів Flags

Кожне ім'я регістра несе певний сенс

A accumulator акумулятор B base база C counter лічильник D data дані BP base pointer покажчик бази SI source index індекс джерела DI destination index індекс приймача SP stack pointer покажчик стека CS code segment сегмент команд DS data segment сегмент даних SS stack segment сегмент стека ES extra segment додатковий сегмент IP instruction pointer лічильник команд

Регістри AX, BX, CX і DX дозволяють нам звертатися не до регістру а до старшого і молодшого байту

AX AH, ALBX BH, DLDX DH, DLCX CX, CL

На даний момент ми використовували регістр AX в кроці "Крок 3 - Програма HelloWord". Для завданні функції переривання.

mov ah, 40hint 21h mov ah, 04Ch int 21h

При цьому використовували тільки частина регістру, а точніше старший байт:

H high старший L low молодший

Чому ми не використовували, скажімо, осередки пам'яті? Та тому що є правила, де що повинно зберігатися при виклику переривання. Точніше що і в якому регістрі повинно знаходитися. Правила, ці описані в документації. Ну, наприклад наша остання функція описана так

Int 21H Функція 4CHAH = 4CH AL = код возвратаВозврата немає.

Припиняє процес і передає операційній системі код повернення.

На даний момент Ви повинні розуміти що для більшості операцій використовуються регістри, а для переривань конкретно є специфікації, в яких написано що і в якому регістрі повинно знаходитися.

Так само в кроці "Крок 7 - Команда MOV". Нам кілька разів зустрілася команда MOV. Ось шматочок:

mov bx, 1 mov cx, 21 mov dx, offset Hellostr mov ah, 40h

Сенс команди MOV в приміщенні з одного місця в інше:

MOV одержувач, споживач

mov bx, 1; помістити в bx 1 mov cx, 21; помістити в cx 21 mov dx, offset Hellostr; помістити в dx зміщення рядка mov ah, 40h; помістити в ah число 40h

Давайте скористаємося кодом кроку "Крок 3 - Програма HelloWord" і знаннями з кроку "Крок 6 - Що таке регістри" про функцію 04Ch тепер ми знаємо, що в молодшому слові регістру AX (AL) можна повернути код виконання програми. Давайте пробувати:

MODEL TINYSTACK 256 DATASEG Hellostr DB 'Hello First Step Site' CODESEG start: mov ax, @ data mov ds, ax mov bx, 1 mov cx, 21 mov dx, offset Hellostr mov ah, 40h int 21h mov ah, 04Ch mov al, 1h int 21hend start

Нічого змінилася програма, як запускалася так далі і запускається. Код повернення програми можна обробляти в BAT файлах. Пишемо run.bat:

@echo off7.exeif errorlevel 1 goto endecho error: endecho end

Слова error не показуватиметься, так як написано, якщо код повернення 1, то перейти на end. Взагалі дана практика поширена досі. Приклад bat файлу з каталогу Windows (windows 98):

choice / c: ynif errorlevel 2 goto FORMAT_CANCELif errorlevel 1 goto FORMAT: FORMAT_CANCEL.

Для вказівки сегмента даних використовується регістр DS. Тобто цей реєстр повинен вказувати на початок даних в нашій програмі або на сегмент DATASEG. Ми з Вами в кроці "Крок 3 - Програма HelloWord" робили так:

mov ax, @ data mov ds, ax

По-перше, що таке @data - це ідентифікатор DATASEG при компіляції і збірки додатку на місце цього слова буде поставлено реальне зміщення сегмента, в якому знаходяться дані. Адже до збірки програми ми цього не знаємо. Так як при даному моделі пам'яті даних зберігаються в кінці коду програми, то навіть додавання однієї команди до зміни його місця розташування. І реально це число буде відомо тільки при складанні.

А чому ми поміщаємо спочатку в регістр AX. Те ж все просто є правило - Ви не можете безпосередньо змінювати вміст регістрів CS, DS, SS. Тобто ми не можемо написати так:

Ми можемо змінити цей регістр тільки використовуючи інші регістри. Отже, дивись всі разом:

mov ax, @ data; в регістра AX зміщення для даних mov ds, ax; встановити регістр DS рівний AX то їсть тепер там зміщення.

Ось так. Я приведу вікно з відладчика, про який розповім пізніше:

Крок 6 - що таке регістри

Ось дивіться, це наш код в командах процесора після виконання команди mov ds, ax у нас регістр DS буде дорівнює регістру AX і в даному випадку від 1343.

Отже, у нас є регістр DS. в який ми не можемо безпосередньо отримати доступ, а тільки використовуючи інші регістри. Цей регістр вказує на дані.

Схожі статті