 |
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 создан для обеспечения
работы с параметрами, локальными переменными другой адресации к
памяти с использованием стека.
Регистр SP
-----------------------------------------------------------------
Регистр SP называется также указателем стека. Это "наименее
общий" из регистров общего назначения, поскольку он практически
всегда используется для специальной цели - обеспечения стека.
Стек - это область памяти, в которой можно сохранять значения и
из которой они могут затем извлекаться по дисциплине "послед-
ний-пришел-первый-ушел" (FIFO). То есть последнее сохраненное в
стеке значение будет первым значением, которое вы получите при
чтении из стека. Классической аналогией стека является стопка та-
релок. Поскольку тарелки можно класть столько сверху стопки (и
брать также), то первая положенная тарелка будет последней, кото-
рую вы сможете взять.
Регистр SP в каждый момент времени указывает на вершину сте-
ка. Как и в случае стопки тарелок, вершина стека - это то место,
в котором в стеке сохраняется следующее помещенное туда значение.
Действие, состоящее в занесении значений в стек, называют также
"заталкиванием" (pushing) в стек. В самом деле, инструкция PUSH
используется для занесения значений в стек. Аналогично, действие,
состоящее в извлечении (выборке) значений из стека, называют так-
же "выталкиванием" (popping) из стека (для этого используется
инструкция POP).
На Рис. 4.6 показывается, как изменяются регистры SP, AX и
BP по мере выполнения следующего кода (при этом подразумевается,
что начальное значение SP равно 1000):
.
.
.
mov ax,1
push ax
mov bx,2
push bx
pop ax
pop bx
.
.
.
|