Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Способы адресации данных процессора Intel 8086Содержание книги
Похожие статьи вашей тематики
Поиск на нашем сайте Способы адресации данных определяют механизмы вычисления эффективных адресов операндов в памяти и доступа к операндам. Выделяют следующие способы (режимы) адресации: 1. Непосредственный. Позволяет задавать фиксированные значения операнда непосредственно в адресной части команды, т.е. искомое значение является частью команды (рис. 5). Такой режим адресации удобен при работе с константами.
Рис. 5. Непосредственная адресация Примеры: mov ax, 5564h; Переслать в регистр ax значение 5564 ; в шестнадцатеричной системе счисления mov ah, ‘A’; Переслать в регистр ah символ A add al, 11010011b; Сложить содержимое регистра al с числом ; 11010011 в двоичной системе счисления Следует помнить, что непосредственный операнд может быть задан только как операнд-источник. Недостатком непосредственной адресации является необходимость расширения формата команд за счёт указания самого операнда в адресном поле команды. 2. Прямой. Адрес операнда содержится в коде команды (рис. 6). Используется при работе с переменными и константами, местоположение которых в памяти не меняется в процессе выполнения задачи.
Рис. 6. Прямая адресация Таким образом, в коде команды указывается смещение операнда в памяти, а соответствующая метка (символьный адрес) предварительно описана в сегменте данных программы.
Пример: d_s segment mm dw 3154h d_s ends c_s segment assume ds:d_s, cs:c_s begin: … mov ax, mm;по адресу mm пересылается 3154 h … c_s ends end begin После выполнения выделенной подчёркиванием команды в регистре ax будет записано значение по адресу mm в памяти, т.е. число 3154 h. 3. Регистровый. Искомое значение операнда содержится в определённом командой регистре, т.е., в адресном поле команды указывается адрес регистра (рис. 7).
Рис. 7. Регистровая адресация Примеры: mov ax, cx; Переслать в регистр ax содержимое ; регистра cx add ah, al; Сложить содержимое регистров ah и al Регистровую адресацию легко отличить от всех остальных по тому признаку, что все операнды команд являются регистрами. Такие команды являются наиболее компактными и выполняются быстрее других типов команд, поскольку отсутствуют обращения к памяти. 4. Регистровый косвенный. Является частным случаем косвенной адресации, когда адрес, указываемый в команде, является указателем ячейки, содержащей смещение операнда в памяти (рис. 8). Фактически в команде указывается адрес адреса, причём в качестве регистра адреса может выступать базовый регистр BP или индексные регистры SI или DI. Следует отметить, что в разных процессорах для размещения адреса могут использоваться и другие регистры. Косвенная адресация является более эффективной, чем прямая, поскольку в адресном поле команды указывается только адрес регистра, который короче полного адреса операнда в памяти. Однако при этом режиме адресации требуется предварительная загрузка регистра косвенным адресом памяти, на что расходуется дополнительное время. Пример: d_s segment mm dw 3154h d_s ends c_s segment assume ds:d_s, cs:c_s begin: … lea si, a; загрузить в регистр si адрес ячейки mm mov ax, [si]; в регистр ax пересылается значение по адресу, ; указанному в регистре si (т.е. число 3154 h) … c_s ends end begin
Рис. 8. Косвенная адресация Косвенную адресацию удобно использовать при решении задач, когда, оставляя неизменным адрес регистра в команде, можно изменять содержимое ячейки с этим адресом. 5. Регистровый относительный. Является обобщением методов адресации, обеспечивающих вычисление эффективного адреса (EA) или смещения операнда в памяти в виде суммы базового значения адреса и «смещения» disp, указываемого в команде (формула 1.1) и (рис. 9).
Относительную адресацию широко применяют как для адресации памяти, представленной в виде блоков (например, сегментов), так и для адресации специальных структур данных: массивов, записей и др. В зависимости от способа использования адресуемого в команде регистра различают индексный и базовый режимы адресации.
Рис. 9. Формирование эффективного адреса при относительной адресации 5.1. Индексный. Применяется для обработки упорядоченных массивов данных; при этом каждый элемент массива определяется собственным номером. Тогда базовый адрес массива задаётся смещением disp, указываемым в команде, а значение индекса (номер ячейки с элементом массива) определяется содержимым индексного регистра (формула 1.2).
Индексная адресация удобна, если необходимо записать или считать список данных из последовательных ячеек памяти не подряд, а с некоторым шагом, указанным в индексе. Пример: d_s segment mas db 3,5,1,8,9,’$’; По адресу mas определена последовательность ; из 6 однобайтовых элементов ;(с учётом символа $) ; $ - признак конца последовательности d_s ends c_s segment assume ds:d_s, cs:c_s begin: … mov si,3;в si – смещение элемента (8) относительно начала ; массива, т.е., адреса mas mov ah, mas[si]; mas - смещение массива в сегменте данных ;в ah – значение элемента массива mas ;cо смещением в si, т.е. 8 … c_s ends end begin Следует отметить, что элементы массива располагаются в памяти в смежных (соседних ячейках) относительно начального (нулевого) элемента, адрес которого в сегменте данных (смещение) является адресом начала всего массива в сегменте данных. Местоположение элемента в массиве характеризуется номером ячейки относительно начального адреса массива (начиная с нуля) и вычисляется как произведение индекса элемента на размер, занимаемый одним элементом в байтах. Чтобы получить доступ к элементу массива в сегменте данных, необходимо задать адрес начала массива и номер ячейки в массиве с нужным элементом. В приведённом выше примере начало массива определяется адресом mas; требуемый элемент (8) является третьим (индексация начинается с нуля); каждый элемент массива занимает 1 байт в памяти. Чтобы определить местоположение данного элемента в сегменте данных, требуется в индексный регистр (в примере SI) поместить номер ячейки в массиве с нужным элементом (в примере 3 = 1×3) и сложить его с начальным адресом массива (в примере mas). 5.2. Базовый. Применяется для доступа к структурам данных переменной длины. Тогда базовый адрес, определяющий начало набора элементов, хранится в базовом регистре, а смещение в команде определяет расстояние до определённого элемента (формула 1.3).
Этот режим адресации удобно использовать для записей – структур данных, содержащих поля различной длины и, возможно, различных типов. В записях с полями различной длины содержимое адресуемого регистра соответствует началу записи, а смещение в команде – расстоянию в записи (номеру ячейки относительно начала записи, с которой начинается требуемое поле записи). Рассмотрим пример организации записи о сотрудниках некоторого отдела и доступа к ней и её полям. Условимся, что все поля символьные. Пример: worker struc;информация о сотрудникеnam db 30 dup (' ') ;фамилия, имя, отчество position db 30 dup (' ') ;должность age db 2 dup(‘ ’) ;возраст standing db 2 dup(‘ ’) ;стаж salary db 5 dup(‘ ’) ;оклад в рублях worker ends d_s segment ;описание одного сотрудника sotr1 worker <‘Иванов Пётр Сергеевич’, ‘программист’, ‘30’, ‘8’, ‘15000’> d_s ends c_s segment assume ds:d_s, cs:c_s begin: … ;загружаем в bx адрес начала записи (базовый адрес) lea bx, sotr1 ;в ax – значение по адресу bx+смещение по полю age ;т.е., от начала записи находим ячейки, ;содержащие информацию о возрасте mov ax, word ptr [bx].age … c_s ends end begin Поля записи располагаются в смежных ячейках, но могут занимать разное количество байтов. В рассмотренном примере в описании структуры (записи) worker поля nam и position занимают по 30 байтов каждое, поля age и standing – по 2 байта каждое, а поле salary – 5 байтов. Имя sotr 1 в сегменте данных является адресом начала записи в сегменте данных, а имена полей фактически задают адреса (номера) ячеек, начиная с нуля, относительно начала записи. Чтобы определить местоположение конкретного поля записи (в примере age), необходимо знать адрес начала записи (в примере sotr 1) и номер ячейки, относительно начала записи, с которой начинается требуемое поле (age). 6. Базово-индексный. Используется для доступа к элементам массива, адресуемого указателем. Базовый адрес массива задаётся указателем базы (базовым регистром), а номер элемента массива – содержимым индексного регистра (формула 1.4).
Пример: d_s segment mas db 3,5,1,8,9,’$’; По адресу mas определена последовательность ; из 6 однобайтовых элементов ; (с учётом символа $) ; $ - признак конца последовательности d_s ends c_s segment assume ds:d_s, cs:c_s begin: … mov si,3;в si – смещение элемента (8) относительно начала ; массива, т.е., адреса mas lea bx,mas; в регистр bx загружается адрес начала массива mas mov ah, bx[si]; bx- смещение (адрес) массива в сегменте данных ; в ah – значение элемента массива mas ; cо смещением в si, т.е. 8 … c_s ends end begin В отличие от индексной адресации, где начальный адрес массива задаётся прямо в команде в виде смещения, в базово-индексном режиме начальный адрес массива предварительно загружается в один из базовых регистров (в примере BX). Как и при косвенной адресации, такой режим адресации данных удобно использовать при работе со сложными структурами, когда по неизменному адресу ячеек изменяется их содержимое. 7. Относительный базовый индексный. Используется для адресации элементов в указываемом массиве записей. Базовый адрес массива задаётся указателем базы, номер записи (т.е., элемента массива) определяется содержимым индексного регистра, а смещение в команде указывает расстояние до записи (формула 1.5).
Чтобы узнать стаж работы третьего сотрудника, сначала нужно в базовый регистр загрузить адрес начала массива (в примере mas _ sotr), затем определить смещение (номер ячейки) в массиве, с которого начинается запись о третьем сотруднике (в примере – это вторая запись, поскольку индексация начинается с нуля), и записать его в индексный регистр. Для определения номера нужной ячейки требуется размер одной записи (woker) в байтах (директива type) умножить на индекс записи в массиве. И, наконец, в найденной записи следует найти нужное поле (в примере standing). Таким образом, чтобы получить доступ к конкретному полю массива записей, сначала необходимо определить начало массива, в нём найти нужную запись, а уже в ней – требуемое поле. Пример: … d_s segment ;опишем массив из 5 сотрудников со значениями по ;умолчанию mas_sotr worker 5 dup (<>) d_s ends c_s segment assume ds:d_s, cs:c_s begin: … ;в bx – адрес начала массива сотрудников lea bx, mas_sotr ;в si – смещение второй (начиная с нуля) записи mov si, (type worker)*2 ; в ax – стаж второго сотрудника mov ax,[bx][si].standing … c_s ends end begin Выбор режима адресации определяется конкретной задачей и во многих случаях очевиден. Однако возникают ситуации, когда для обращения к одним и тем же элементам данных допускается использовать нескольких способов адресации. В конечном итоге, при написании программы сам пользователь осуществляет выбор конкретного режима адресации.
|
|||||||||||||||||||||||||||||
|
Последнее изменение этой страницы: 2020-12-09; просмотров: 537; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.21 (0.01 с.) |