CodeNet / Языки программирования / Ассемблер / СПРАВОЧНИК по системе программирования ТУРБО АССЕМБЛЕР 2.0
СПРАВОЧНИК по системе программирования ТУРБО АССЕМБЛЕР 2.0
Регистр CX
-----------------------------------------------------------------
Специализация регистра CX - использование в качестве счетчи-
ка. Предположим, мы хотим 10 раз повторить выполнение блока инст-
рукций. Это можно сделать следующим образом:
.
.
.
mov cx,10
Begin: .
.
.
.
<блок инструкций, который нужно повторить>
.
.
.
sub cx,1
jnz Begin
.
.
.
Не беспокойтесь, если в программе вы увидите незнакомые эле-
менты. Важно то, что инструкции между меткой Begin и инструкцией
JNZ будут повторяться до тех пор, пока содержимое регистра CX не
станет равным 0. Заметим, что чтобы уменьшить содержимое CX и пе-
рейти на начало цикла Begin, если регистр CX еще не равен 0,
здесь используются две инструкции - SUB CX,1 и JNZ.
Уменьшение значения счетчика и цикл - это часто используемый
элемент программы, поэтому в процессоре 8086 используется специ-
альная инструкция для того, чтобы циклы выполнялись быстрее и
были более компактными. Эта инструкция называется LOOP. Инструк-
ция LOOP (инструкция цикла) вычитает 1 из значения регистра CX и
выполняет переход, если содержимое регистра CX не равно 0 (все
это в одной инструкции). Для приведенного выше примера можно за-
писать такой эквивалент:
.
.
.
mov cx,10
Begin: .
.
.
.
<блок инструкций, который нужно повторить>
.
.
.
loop Begin
.
.
.
К рассмотрению циклов мы вернемся в Главе 5 "Основные эле-
менты программы на языке Ассемблера". А пока запомните, что ре-
гистр CX особенно полезен для использования в циклах и в качестве
счетчика.
Как и регистры AX, BX и DX, регистр CX можно интерпретиро-
вать, как два 8-разрядных регистра - CH и CL.
Регистр DX
-----------------------------------------------------------------
Регистр DX - это единственный регистр, которые может исполь-
зоваться в качестве указателя адреса ввода-вывода в инструкциях
IN и OUT. Фактически, кроме использования регистра DX нет другого
способа адресоваться к портам ввода-вывода с 256 по 65535. Напри-
мер, в следующем фрагменте программы в порт 1000 записывается
значение 62:
.
.
.
mov al,62
mov dx,1000
out dx,al
.
.
.
Другие уникальные качества регистра DX относятся к операциям
деления и умножения. Когда вы делите 32- или 16-битовый делитель,
старшие 16 бит делимого должны быть помещены в регистр DX. После
выполнения деления остаток также сохраняется в DX. (Младшие 16
бит делимого должны быть помещены в AX. Частное от деления также
будет записано в AX.) Аналогично, когда вы перемножаете два
16-битовых сомножителя, старшие 16 бит произведения сохраняются в
DX (младшие 16 бит записываются в регистр AX).
Как и регистры AX, BX и DX, регистр DX можно интерпретиро-
вать, как два 8-разрядных регистра - DH и DL.
Регистр SI
-----------------------------------------------------------------
Как и регистр BX, регистр SI может использоваться, как ука-
затель на ячейку памяти. Например:
.
.
.
mov ax,0
mov ds,ax
mov si,20
mov al,[si]
.
.
.
Здесь 8-битовое значение, содержащееся по адресу 20, записы-
вается в регистр AL. Особенно полезно использовать регистр SI для
ссылки на память в строковых инструкциях процессора 8086. Напри-
мер:
.
.
.
mov ax,0
mov ds,ax
mov si,20
mov al,[si]
lodsb
.
.
.
Здесь не только содержимое по адресу памяти, на который ука-
зывает SI, сохраняется в регистре AX, но к SI также добавляется
1. Это может оказаться очень эффективным при организации доступа
к последовательным ячейкам памяти (например, к строке текста).
Кроме того, можно сделать так, что строковые инструкции будут ав-
томатически определенное число раз повторять свои действия, так
что отдельная инструкция может выполнить сотни, а иногда и тысячи
действий. Строковые инструкции мы более детально обсудим далее.
Регистр DI
-----------------------------------------------------------------
Регистр DI очень похож на регистр SI в том плане, что его
можно использовать в качестве указателя ячейки памяти. При ис-
пользовании его в строковых инструкциях он имеет также особые
свойства. Например:
.
.
.
mov ax,0
mov ds,ax
mov di,1024
add bl,[di]
lodsb
.
.
.
Здесь 8-битовое значение, расположенное по адресу 1024, за-
писывается в регистр BL. при использовании его в строковых инст-
рукциях регистр DI несколько отличается от регистра SI. В то вре-
мя как SI всегда используется в строковый инструкциях, как указа-
тель на исходную ячейку памяти (источник), DI всегда служит ука-
зателем на целевую ячейку памяти (приемник). Кроме того, в стро-
ковых инструкциях регистр SI обычно адресуется к памяти относи-
тельно сегментного регистра DS, тогда как DI всегда адресует-
ся к памяти относительно сегментного регистра ES. (Когда регистры
SI и DI используются в качестве указателей на ячейки памяти в
других инструкциях (не строковых), то они всегда адресуются к па-
мяти относительно регистра DS.) Например:
.
.
.
cld
mov dx,0
mov es,dx
mov di,2048
stosb
.
.
.
Строковая инструкция STOSB используется здесь и для сохра-
нения значения в регистре AL (по адресу памяти, на который указы-
вает регистр DI), и для добавления к содержимому регистра DI 1.
Однако мы несколько забежали здесь вперед: перед изучением стро-
ковых инструкций нам нужно сперва узнать о сегментах и сегментных
регистрах. Строковые инструкции мы более детально обсудим в далее
в данном руководстве.
Регистр BP
-----------------------------------------------------------------
Как и регистры BX, SI и DI, регистр BP также может использо-
ваться в качестве указателя на ячейку памяти, но здесь есть неко-
торые отличия. Регистры BX, SI и DI обычно ссылаются на память
относительно сегментного регистра DS (или, в случае использования
в строковых инструкциях регистра DI, относительно сегментного ре-
гистра ES), а регистр BP адресуется к памяти относительно регист-
ра SS (сегментный регистр стека).
Здесь мы снова забегаем несколько вперед, поскольку сегменты
мы еще не рассматривали, но принцип именно таков. Один из полез-
ных способов передачи параметров в подпрограмму состоит в занесе-
нии параметров в стек. Так делается в языках Паскаль и Си (см.
главу "Интерфейс Турбо Ассемблера с Турбо Си", где поясняется,
как и почему в языке Си для передачи параметров используется
стек).
Стек находится в сегменте, на который указывает регистр SS.
Например:
.
.
.
push bp
mov bp,sp
mov ax,[bp+4]
.
.
.
Здесь выполняется обращение к сегменту стека для загрузки в
AX первого параметра, передаваемого при вызове Турбо Си подпрог-
раммы на Ассемблере.
Если говорить кратко, то регистр BP создан для обеспечения
работы с параметрами, локальными переменными другой адресации к
памяти с использованием стека.
