On-Line Библиотека www.XServer.ru - учебники, книги, статьи, документация, нормативная литература.
       Главная         В избранное         Контакты        Карта сайта   
    Навигация XServer.ru








 

Регистры процессора 8086 / 8088 / 80186 / 80286

Автор: © oleg

Регистр, как мы уже рассматривали раньше, - это, просто говоря, специально отведенная память для временного хранения каких-то данных, переменная.

Микропроцессор 8086 имеет 14 регистров. В прошлом выпуске мы встретили два из них: AH и DX. В Таблицах N 1, 2 и 3 приведены списки всех регистров, кроме IP и регистра флагов, которые со временем будут рассматриваться отдельно:

AX

BX

CX

DX

AH

AL

BH

BL

CH

CL

DH

DL

Таблица N 1. Регистры данных

SI

DI

BP

SP

Таблица N 2. Регистры-указатели

CS

DS

ES

SS

Таблица N 3. Сегментные регистры

 

Регистры данных (Таблица N 1).

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

В верхнем ряду Таблицы (AX (аккумулятор), BX (база), CX (счетчик), DX (регистр данных)) находятся шестнадцатиразрядные регистры, которые могут хранить числа от 0 до 65.535 (от 0h до FFFFh в шестнадцатеричной системе (вспоминаем прошлый выпуск)). Под ним идет ряд восьмиразрядных регистров (AH, AL, BH, BL, CH, CL, DH, DL), которые могут хранить максимальное число 255 (FFh). Это половинки (старшая или младшая) шестнадцатиразрядных регистров.

Например:

Мы уже знаем оператор mov, который предназначен для загрузки числа в регистр. Чтобы присвоить, к примеру, регистру AL число 35h, нам необходимо записать так:

mov al,35h

а регистру AX число 346Ah так:

mov ax,346Ah

Если мы попытаемся загрузить большее число, чем может содержать регистр, то, при ассемблировании нашей программы, Ассемблер выдаст ошибку.

Например, следующие записи будут ошибочны:

mov ah,123h ---> максимум FFh

mov bx,12345h ---> максимум FFFFh

mov dl,100h ---> максимум FFh

Здесь надо отметить, что если шестнадцатеричное число начинается не с цифры (напр.: 12h), а с буквы (напр.: С5h), то перед таким числом ставится нуль: 0C5h. Это необходимо для того, чтобы Ассемблер мог отличить где шестнадцатеричное число, а где метка. Ниже мы рассмотрим это на примере.

Допустим, мы выполнили команду mov ax,1234h. В этом случае в регистре ah будет находится число 12h, а в регистре al 34h. Т.е. ah, al, bh, bl, ch, cl, dh и dl это младшие (Low) или старшие (High) половинки шестнадцатиразрядных регистров (см. Таблицу N 4).

Команда:

Результат:

mov ax,1234h

mov bx,5678h

mov cx,9ABCh

mov dx,0DEF0h

AX = 1234h, AH = 12h, AL = 34h

BX = 5678h, BH = 56h, BL = 78h

CX = 9ABCh, CH = 9Ah, CL = 0BCh

DX = 0DEF0h, DH = 0DEh, DL = 0F0h

Таблица N 4. Результаты выполнения различных команд

Новые операторы

Рассмотрим еще два оператора: add и sub.

Оператор ADD имеет следующий формат (в последствии мы всегда будем оформлять новые команды в такие таблицы):

Команда Перевод (с англ.) Назначение Процессор
ADD приемник, источник Addition сложение (гл. to add сложить) Сложение 8086

В столбце Команда будет описываться новая команда и ее применение. В столбце Назначение что выполняет или для чего служит данная команда, а в столбце Процессор модель процессора с которого она поддерживается. Перевод с какого английского слова образован оператор и его перевод. В данном примере это 8086 процессор, но работать команда будет, естественно и на последующих процессорах (80286, 80386 и т.д.).

Команда ADD производит сложение двух чисел.

Примеры:

mov al,10 ---> загружаем в регистр AL число 10

add al,15 ---> al = 25; al - приемник, 15 - источник

 

mov ax,25000 ---> загружаем в регистр AX число 25000

add ax,10000 ---> ax = 35000; ax - приемник, 10000 - источник

 

mov cx,200 ---> загружаем в регистр CX число 200

mov bx,760 ---> а в регистр BX --- 760

add cx,bx ---> cx = 960, bx = 760 (bx не меняется); cx - приемник, bx - источник 

Команда Перевод (с англ.) Назначение Процессор
SUB приемник, источник Subtraction вычитание Вычитание 8086

Команда SUB производит вычитание двух чисел.

Примеры:

mov al,10

sub al,7 ---> al = 3; al - приемник, 7 - источник

 

mov ax,25000

sub ax,10000 ---> ax = 15000; ax - приемник, 10000 - источник

 

mov cx,100

mov bx,15

sub cx,bx ---> cx = 85, bx = 15 (bx не меняется); cx - приемник, bx - источник

 

Это интересно

Следует отметить, что Ассемблер максимально быстрый язык. Можно посчитать сколько раз за одну секунду процессор сможет сложить два любых числа от 0 до 65535.

Каждая команда процессора выполняется определенное количество тактов. Когда говорят, что тактовая частота процессора 100Mhz, то это значит, что за секунду проходит 100 миллионов тактов.

Чтобы сложить два числа в Ассемблере нужно выполнить следующие команды:

mov ax,2700

mov bx,15000

add ax,bx

В результате выполнения данных инструкций, в регистре AX будет число 17700, а в регистре BX - 15000. Команда add ax,bx выполняется за один такт на процессоре 80486. Получается, что компьютер 486 DX2-66Mhz за одну секунду сложит два числа любых числа (от 0 до 0FFFFh) 66 миллионов раз!

 

Регистры-указатели (Таблица N 2).

Регистры SI (индекс источника) и DI (индекс приемника) используются в строковых операциях. Регистры BP и SP необходимы при работе со стеком. Мы их будем подробно рассматривать в последующих выпусках.

 

Сегментные регистры (Таблица N 3).

Сегментные регистры необходимы для обращения к тому или иному сегменту памяти (например, видеобуферу). Сегментация памяти довольно сложная и объемная тема, которую также будем рассматривать в последующих выпусках. 

Новые операторы

Команда Перевод (с англ.) Назначение Процессор
INC приемник Increment инкремент Увеличение на единицу 8086

Команда INC увеличивает на единицу регистр. Она эквивалентна команде

ADD источник, 1

только выполняется гораздо быстрее.

Примеры:

mov al,15

inc al ---> теперь AL = 16 (эквивалентна add al,1)

 

mov dh,39h

inc dh ---> DH = 3Ah (эквивалентна add dh,1)

 

mov cl,4Fh

inc cl ---> CL = 50h (эквивалентна add cl,1)

_____________________

 

Сегодня рассмотрим одну небольшую программку, которая выводит на экран сообщение, и ждет когда пользователь нажмет любую клавишу. После чего возвращается в DOS.

Управлять клавиатурой позволяет прерывание 16h. Это прерывание BIOS (ПЗУ), а не MS-DOS (как 21h). Его можно вызывать даже до загрузки операционной системы, в то время, как прерывание 21h доступно только после загрузки COMMAND.COM.

Чтобы остановить программу до нажатия любой клавиши следует вызвать функцию 10h прерывания 16h. Вот как это выглядит (после стрелки (--->) идет комментарий):

mov ah,10h ---> в AH всегда указывается номер функции

int 16h ---> вызываем прерывание 16h - сервис работы с клавиатурой BIOS (ПЗУ)

 

После нажатия на любую клавишу, компьютер продолжит выполнять программу, а регистр AX будет содержать код клавиши, которую нажал пользователь.

Следующая программа выводит на экран сообщение и ждет нажатия любой клавиши (равнозначна команде pause в *.bat файлах):

 

(1) CSEG segment

(2) org 100h

(3) Start:

(4)

(5) mov ah,9

(6) mov dx,offset String

(7) int 21h

(8)

(9) mov ah,10h

(10) int 16h

(11)

(12) int 20h

(13)

(14) String db 'Нажмите любую клавишу...$'

(15) CSEG ends

(16) end Start

 

Строки с номерами (1), (2) и (15) пока опускаем. В строках (5) - (7), как вы уже знаете, выводим на экран сообщение. Затем, строки (9) - (10), ждем нажатия клавиши. И, наконец, строка (20) выходит из нашей программы.

Мы уже знаем команды INC, ADD и SUB. Можно поэксперементировать с вызовом прерывания. Например, так:

mov ah,0Fh

inc ah

int 16h

Это позволить Вам лучше запомнить новые операторы.



Литература по Assembler