Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

СПРАВОЧНИК по системе программирования ТУРБО АССЕМБЛЕР 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 создан  для  обеспечения
работы  с  параметрами, локальными переменными другой адресации к
памяти с использованием стека.



Оглавление

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог