Инструменты пользователя

Инструменты сайта


examination:asm:question6

Вопрос №6. Базирование и индексирование в машинных командах. Сегментные и индексные регистры. Примеры.

Базово-Индексный режим адресации

При базово-индексном режиме адресации для вычисления адреса операнда в памяти процессор складывает значения двух регистров, один из которых называется базовым, а другой — индексным. Для организации подобного режима адресации может использоваться пара любых 32-разрядных регистров общего назначения. Ниже приведено несколько примеров:

. data

array WORD 1000h,2000h,3000h

. code

mov ebx,OFFSET array

mov esi,2

mov ах,[ebx+esi] ; АХ = 2000h

mov edi,OFFSET array

mov ecx,4

mov ах,[edi+ecx] ; АХ = 3000h

mov ebp,OFFSET array

mov esi,0

mov ах,[ebp+esi] ; АХ = 1000h

Иными словами данный режим адресации позволяет работать удобным способом с массивами данных

В реальном режиме адресации также возможно организовать базово-индексную адресацию, воспользовавшись 16-разрядными регистрами. Однако при этом нельзя выбирать пару произвольных регистров, как это делается в защищенном 32-разрядном

режиме. Допускаются только следующие комбинации: [bx+si], [bx+di ], [bp+si] и [bp+di ]. В реальном режиме регистр ВР используется для адресации данных в стеке, поэтомудляорганизации базово-индексной адресации он применяется редко.

Косвенная базовая адресация

При косвенной базовой (регистровой) адресации эффективный адрес операнда может находиться в любом из регистров общего назначения, кроме SP/ESP и ВР/ЕВР (это специальные регистры для работы с сегментом стека).

Синтаксически в команде этот режим адресации выражается заключением имени регистра в квадратные скобки. К примеру, команда mov ax,[ecx] помещает в регистр АХ содержимое слова по адресу сегмента данных со смещением, хранящимся в регистре ЕСХ. Так как содержимое регистра легко изменить в ходе работы программы, данный способ адресации позволяет динамически назначить адрес операнда для некоторой машинной команды. Это очень полезно, например, для организации циклических вычислений и для работы с различными структурами данных типа таблиц или массивов.

Сегментные и Индексные регистры

В качестве сегментных и индексных регистров используются как правило следующие регистры

Сегментные регистры. Эти регистры используются в качестве базовых при обращении к заранее распределенным областям оперативной памяти, которые называются сегментами. Существует три типа сегментов и, соответственно, сегментных регистров:

  • кода (CS), в них хранятся только команды процессора, т.е. машинный код программы;
  • данных (DS, ES, FS и GS), в них хранятся области памяти, выделяемые под переменные программы и под данные;
  • стека (SS), в них хранится системная область памяти, называемая стеком, в которой распределяются локальные (временные) переменные программы и параметры, передаваемые функциям при их вызове.

Индексные: как правило используются регистры ESI,EDI, у которых буква I на конце обозначает индекс. Индексные регистры (Index register) участвуют в операциях с индексной адресацией. Под этими операциями понимают те, в которых адрес элемента в памяти вычисляется, например, по правилу: <база>+<содержимое индексного регистра>*<длина элемента данных>. Эта адресация используется при операциях с массивами, строками и другими линейно-упорядоченными объектами (то есть объектами однотипных данных, расположенных в памяти «подряд»). При некоторых операциях различают индекс источника (Source Index) и индекс получателя, или приемника (Destination Index). примером могут служить циклические операции со строками.

examination/asm/question6.txt · Последние изменения: 2014/01/15 08:13 (внешнее изменение)