Шаг 6 - Что такое регистры




Регистры это специальные ячейки памяти. Это самое главное. Вся их прелесть в том, что обращение к регистрам производиться значительно быстрее чем к оперативной памяти ПК. Именно по этой причине регистры используются для команд процессора. От туда процессору удобно и быстро получать информацию. Если говорить o ПК с типом процессоров 286. А мы пока именно такой процессор и рассматриваем то размер регистра 16 бит. Каждый регистр имеет имя и свое назначение. Они бывают следующие по типам.

регистры общего назначения AX, BX, CX, DX, BP, SI, DI, SP cегментные регистры 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

Так же в шаге "Шаг 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......

Шаг 8 - Регистр DS

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

mov ax,@data mov ds,ax

Во-первых, что такое @data - это идентификатор DATASEG при компиляции и сборки приложения на место этого слова будет поставлено реальное смещение сегмента, в котором находятся данные. Ведь до сборки программы мы этого не знаем. Так как при данному модели памяти данных хранятся в конце кода программы, то даже добавление одной команды к изменению его местоположения. И реально это число будет известно только при сборке.

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

mov ds,12345

Мы можем изменить этот регистр только используя другие регистры. Итак, смотри все вместе:

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

Вот так. Я приведу окно из отладчика, о котором расскажу позже:

Вот смотрите, это наш код в командах процессора после выполнения команды mov ds,ax у нас регистр DS будет равен регистру AX и в данном случае от 1343.

Итак, у нас есть регистр DS, в который мы не можем непосредственно получить доступ, а только используя другие регистры. Этот регистр указывает на данные.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: