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 создан для обеспечения работы с параметрами, локальными переменными другой адресации к памяти с использованием стека.