Регистры общего назначения
Восемь регистров общего назначения (или общих регистров) процессора 8086 (каждый размером 16 бит) используются в операциях большинства инструкций в качестве источника или приемника при перемещении данных и вычислениях, указателей на ячейки памяти и счетчиков. Каждый регистр общего назначения может использоваться для хранения 16-битового значения, в арифметических и логических операциях, может выполняться обмен между регистром и памятью (запись из регистра в память и наоборот). Например, в данном фрагменте программы:
mov ах, 5
mov dx,9
add ax,dx
значение 5 загружается в регистр АХ. значение 9 - в DX. и эти два значения складываются вместе.
При этом результат (14) сохраняется в регистре АХ. Вместо регистров АХ и DX здесь можно использовать регистр CX. SI или любой другой регистр общего назначения.
Кроме такого общего свойства регистров, как использования их для хранения значений или в качестве источника и приемника при работе в инструкциях с данными, каждый регистр общего назначения имеет свою особенность.
Регистр АХ называют также накопителем (аккумулятором). Этот регистр всегда используется в операциях умножения или деления и является также одним из тех регистров, который можно использовать для наиболее эффективных операций (арифметических, логических или операций перемещения данных).
Младшие 8 бит регистра АХ называются также регистром AL. а старшие 8 бит - регистром АН. Это может оказаться удобным при работе с данными размером в байт. Таким образом, регистр АХ можно использовать, как два отдельных регистра. В следующем фрагменте программы регистр АН устанавливается в значение 0. это значение копируется в AL и затем в регистр AL добавляется 1:
mov ah.O
mov al.ah
inc al
В результате в регистре АХ будет записано значение 1. Регистры BX, CX и DX могут аналогичным образом использоваться либо как один 16 разрядный регистр, либо как два 8-разрядных.
Регистр ВХ может использоваться для ссылки на ячейку памяти (указатель). Если говорить кратко, то 16-битовое значение, записанное в ВХ. может использоваться в качестве части адреса ячейки памяти, к которой производится доступ. Например, следующий код загружает в AL содержимое адреса памяти 9:
mov ax,0
mov ds,ax
mov bx,9
mov al,[bx]
Как можно заметить, перед обращением к ячейке памяти, на которую указывает ВХ. мы загрузили в DS значение 0 (через регистр АХ). Это результат сегментной организации памяти процессора 8086. По умолчанию, когда ВХ используется в качестве указателя на ячейку памяти, он ссылается на нее относительно сегментного регистра DS. Регистр ВХ может интерпретироваться, как два восьмибитовых (8-разрядных) регистра - ВН и BL.
Специализация регистра СХ - использование в качестве счетчика. Предположим, мы хотим 10 раз повторить выполнение блока инструкции. Это можно сделать следующим образом:
mov сх, 1
Begin:
<блок инструкций, который нужно повторить>
sub cx, 1
jnz Begin
Инструкции между меткой Begin и инструкцией JNZ будут повторяться до тех пор, пока содержимое регистра СХ не станет равным 0. 'Заметим, что чтобы уменьшить содержимое СХ и перейти на начало цикла Begin, если регистр СХ еще не равен 0. здесь используются две инструкции - SUB СХЛ и JNZ.
Уменьшение значения счетчика и цикл - это часто используемый элемент программы, поэтому в процессоре 8086 используется специальная инструкция для того, чтобы циклы выполнялись быстрее и были более компактными. Эта инструкция называется LOOP. Инструкция LOOP (инструкция цикла) вычитает 1 из значения регистра СХ и выполняет переход, если содержимое регистра СХ не равно 0 (все это в одной инстрлтшни). Для приведенного выше примера можно записать такой эквивалент:
mov сх,10
Begin:
<блок инструкций, который нужно повторить>
loop Begin
Регистр СХ можно интерпретировать, как два 8-разрядных регистра СН и CL.
Регистр DX - это единственный регистр, которые может использоваться в качестве указателя адреса ввода-вывода в инструкциях IN и OUT. Фактически, кроме использования регистра DX нет другого способа адресоваться к портам ввода-вывода с 256 по 65535. Например, в следующем фрагменте программы в порт 878h (LPT) записывается значение 62:
mov al,62
mov dx,878h
out dx,al
Другие уникальные качества регистра DX относятся к операциям деления и умножения. Когда вы делите 32- или 16-битовый делитель, старшие 16 бит делимого должны быть помешены в регистр DX. После выполнения деления остаток также сохраняется в DX. (Младшие 16 бит делимого должны быть помешены в АХ. Частное от деления также будет записано в АХ.) Аналогично, когда вы перемножаете два 16-битовых сомножителя, старшие 16 бит произведения сохраняются в DX (младшие 16 бит записываются в регистр АХ). Регистр DX можно интерпретировать, как два 8-разрядных регистра – DH и DL.
Регистр SI может использоваться, как указатель на ячейку памяти. Например:
mov ах,0
mov ds,ax
mov si, 20
mov al,[si]
Здесь 8-бнтовое значение, содержащееся по адресу 20, записывается в регистр AL. Особенно полезно использовать регистр SI для ссылки на память в строковых инстр\"кциях процессора 8086. Например:
mov ах,0
mov ds,ax
mov si, 20
mov al,[si]
lodsb
Здесь не только содержимое по адресу памяти, на который указывает SL сохраняется в регистре АХ, но к SI также добавляется 1. Это может оказаться очень эффективным при организации доступа к последовательным ячейкам памяти (например, к строке текста). Кроме того, можно сделать так. что строковые инстр\"кцин будут автоматически определенное число раз повторять свои действия, так что отдельная инструкция может выполнить сотни, а иногда и тысячи действий.
Регистр DI очень похож на регистр SI в том плане, что его можно использовать в качестве указателя ячейки памяти. При использовании его в строковых инструкциях он имеет также особые свойства. Например:
mov ах,0
mov ds,ax
mov di,1024
add bl,[di]
lodsb
Здесь 8-бнтовое значение, расположенное по адресу 1024, записывается в регистр BL. При использовании его в строковых инструкциях регистр DI несколько отличается от регистра SL В то время как 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 также может использоваться в качестве указателя на ячейку памяти, но здесь есть некоторые отличия. Регистры ВХ. SI и DI обычно ссылаются на память относительно сегментного регистра DS (или, в случае использования в строковых инструкциях регистра DI, относительно сегментного регистра ES), а регистр BP адресуется к памяти относительно регистра SS (сегментный регистр стека).
Стек находится в сегменте, на который указывает регистр SS. Например:
push bp
mov bp,sp
mov ax,[bp+4]
Здесь выполняется обращение к сегменту стека для загрузки в АХ первого параметра, передаваемого при вызове Турбо Си подпрограммы на Ассемблере. Если говорить кратко, то регистр BP создан для обеспечения работы с параметрами, локальными переменными другой адресации к памяти с использованием стека.
Регистр SP называется также указателем стека. Это "наименее общий" из регистров общего назначения, поскольку он практически всегда используется для специальной цели - обеспечения стека. Стек - это область памяти, в которой можно сохранять значения и из которой они могут затем извлекаться по дисциплине "последний — пришел — первый - ушел" (LIFO). То есть последнее сохраненное в стеке значение будет первым значением, которое вы получите при чтении из стека.
Регистр SP в каждый момент времени указывает на вершину стека. Действие, состоящее в занесении значений в стек, называют также "заталкиванием" (pushing) в стек. В самом деле, инструкция PUSH используется для занесения значений в стек. Аналогично, действие, состоящее в извлечении (выборке) значений из стека, называют также "выталкиванием" (popping) из стека (для этого используется инструкция POP).
На рисунке 3 показывается, как изменяются регистры SP. АХ и BP по мере выполнения следующего кода (при этом подразумевается, что начальное значение SP равно 1000. а круглые скобки означают содержимое регистров и ячеек памяти):
mov ах, 1
push ах
mov bx,2
push bx
pop ax
pop bx
Рисунок 3. Регистры AX, BX SP и стек
Внимание! Стек используется всякий раз, когда вы вызываете подпрограмму. Кроме того, стек используют некоторые системные ресурсы, когда они прерывают процессор, чтобы выполнить свои функции. Если вы измените SP, даже на несколько инструкций, то правильное значение стека может оказаться недоступным, когда он потребуется системным ресурсам.
Лекция 54
Адресация памяти в МП 8086
Дата добавления: 2016-07-05; просмотров: 2980;