Хорошая новость: нас уже
почти 200 человек. Радует
то, что желающих изучать язык
Ассемблера еще довольно-таки много.
В прошлом
выпуске мы рассмотрели с вами
шестнадцатеричную систему
счисления и простую программу
вывода строки на экран.
Сегодня в нашей рассылке регистры
процессора 8086 / 8088 / 80186 / 80286.
Регистр, как
мы уже рассматривали раньше, - это,
просто говоря, специально
отведенная память для временного
хранения каких-то данных,
переменная.
Микропроцессор
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
Таблица
N2.
Регистры-указатели
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 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 миллионов раз!
Регистры-указатели
(Таблица N2).
Регистры SI (индекс
источника) и DI (индекс приемника)
используются в строковых
операциях. Регистры BP и SP
необходимы при работе со стеком. Мы
их будем подробно рассматривать в
последующих выпусках.
Сегментные регистры (Таблица N3).
Сегментные регистры
необходимы для обращения к тому или
иному сегменту памяти (например,
видеобуферу). Сегментация памяти
довольно сложная и объемная тема,
которую также будем рассматривать
в последующих выпусках.
Новые операторы
Команда
Перевод (с англ.)
Назначение
Процессор
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
Это позволить Вам лучше
запомнить новые операторы.
____________________
В следующем выпуске
рассмотрим двоичную систему
счисления, сегментацию памяти и
сегментные регистры. Напишем
интересную программку.