Для решения щадачи тебе нужно для начала это все считать : ПРАКТИЧЕСКОЕ ЗАНЯТИЕ _3
ОСНОВНЫЕ ТИПЫ ДАННЫХ. СПОСОБЫ АДРЕСАЦИИ
Цель работы:
Практическое овладение навыками разработки программного кода на языке Ассемблер.
Изучение различных способов Практическое освоение основных функций отладчика TD.
адресации операндов.
Написать программу согласно заданию
Ответить на контрольные вопросы
Постановка задачи:
- Написать программу с именем Prog_№.asm используя различные виды режимов
адресации, сделать исполняемый файл, и проследить за работой в Турбоотладчике
(фрагмент программы Приложение 1). - Опишите в сегменте данных следующую информацию:
- На основе работы программы в таблице 1, в графы 2 и 3 зафиксировать значение операнда
приемника на каждом шаге программы.
Таблица 1
Оператор Операнд-приемник
до выполнения После выполнения
1 2 3 - Выполнить задание варианта (Приложение_2). На основе работы программы в таблице 1,
в графы 2 и 3 зафиксировать значение операнда приемника на каждом шаге программы.
Теоретические сведения
Режимы адресации
Важной особенностью машинных команд является то, что они не могут манипулировать
одновременно 2-мя операндами, находящимися в оперативной памяти (ОЗУ). Это означает, что в
команде только 1 операнд может указывать на ячейку ОЗУ, другой операнд должен быть либо
регистром, либо непосредственным значением.
По этой причине возможны следующие сочетания операндов в команде:
а) регистр – регистр;
б) регистр – память;
в) память – регистр;
г) регистр – непосредственный операнд;
д) память – непосредственный операнд.
Для команд характерно, что при наличии двух операндов первый из них является
приемником, а второй – источником. Результат операции сохраняется по первому адресу, вот
почему первый операнд никогда не может быть непосредственным операндом или, иначе говоря,
константой.
Практическое задание _3
Смещение, которое вычисляется операционным блоком для доступа к находящемуся в
памяти операнду, называется исполнительным адресом операнда. Этот исполнительный адрес
показывает, на каком расстоянии (в байтах) от начала сегмента располагается искомый операнд.
В зависимости от используемого режима адресации получение исполнительного адреса
может заключаться только в извлечении его как составной части исполняемой команды, а могут
потребоваться дополнительные операции сложения составной части команды с содержимым
других регистров.
- Способы адресации приведены в табл.1.
Таблица 1
N
п/п
Адресация Основной
формат
оператора
Сегмент
по
умолчанию
Примечание
1 Регистровая заключается в
указании в команде самого
регистра в котором
содержится значение
операнда,
Регистр
1 или 2 байта
Наиболее быстрое
выполнение
2 Непосредственная –
заключается в указании в
команде самого значения
операнда, а не его адреса;
Данное
1 или 2 байта
Применяется в операциях
с константами
3 Прямая – предполагает
указание в команде
непосредственно
исполнительного адреса;
Исполнительны
й адрес 2 байта
DS Применяется для
однократного обращения
к памяти
4 Косвенная регистровая – в
команде указывается адрес
регистра или ячейки памяти,
в которых хранится адрес
операнда или его
составляющие;
[BX]
[ВР]
[SI]
[DI]
DS
SS
DS
DS
Применяется при работе с
одномерными массивами
5 Базовая [BX] + сдвиг
[BP] + сдвиг
DS
SS
Применяется для
обращения к элементу
структуры, нач. адрес
которой в ВР или ВХ
6 Прямая с индексированием Сдвиг[SI]
Сдвиг [DI]
DS
DS
Применяется при работе c
одномерными массивами,
сдвиг – нач. адрес массива
7 По базе с индексированием Сдв.[BX][SI]
Сдв.[BX][DI]
Сдв.[BP][SI]
Сдв.[BP][DI]
DS
DS
SS
SS
Применяется при работе с
двумерными массивами
Из семи режимов адресации самыми быстрыми являются регистровая и непосредственная
адресации операндов, поскольку в этом случае операционный блок микропроцессора 8×86
извлекает их либо из регистров (при регистровой адресации), либо из конвейера команд (при
непосредственной адресации). В других режимах адресация выполняется дольше, потому что
интерфейс шины вначале должен вычислить адрес ячейки памяти, извлечь операнд и только
после этого передать его операционному блоку.
Каждое описание режима адресации, приведенное в данном разделе, сопровождается
примерами его применения. В большинстве случаев для этого используется команда MOV
микропроцессора 8×86.
Практическое задание _3
Регистровая и непосредственная адресация
При регистровой адресации микропроцессор 8×86 извлекает операнд из регистра (или
загружает его в регистр). Например, команда
MOV AХ,СХ
копирует 16-битовое содержимое регистра счетчика СХ в аккумулятор АХ. Содержимое
регистра СХ не изменяется. В данном примере микропроцессор 8×86 использует регистровую
адресацию для извлечения операнда-источника из регистра СХ и загрузки его в регистрприемник АХ.
Непосредственная адресация позволяет Вам указывать 8- или 16-битовое значение
константы в качестве операнда-источника. Эта константа содержится в команде (куда она
помещается Ассемблером), а не в регистре или в ячейке памяти. Например, команда
MOV СХ,500
загружает значение 500 в регистр СХ, а команда
MOV CL,-30
загружает значение – 30 в регистр CL.
Чтобы избежать трудностей, помните, что допустимые значения для 8-битовых чисел со
знаком ограничены диапазоном от -128 (80Н) до 127 (7FH), а допустимые значения 16-битовых
чисел со знаком — диапазоном от —32768 (8000Н) до 32767 (7FFFH). Максимальные значения
8-битовых чисел без знака равны соответственно 255 (OFFH) и 65535 (OFFFFH).
Расширение знакового бита непосредственных значений
Ассемблер всегда расширяет знак при пересылке непосредственных значений в операндприемник. Это означает, что он дублирует старший значащий бит значения источника до тех пор,
пока не будут заполнены все 8 или 16 битов операнда-приемника.
Например, операнд-источник нашего первого примера, десятичное число 500, может быть
записано в виде 10-битового двоичного значения 0 111 110 100. Когда Ассемблер устанавливает,
что Вы требуете загрузить это значение в 16-битовый регистр СХ, то он расширяет его до 16-
битового, записав перед ним шесть копий “знакового” бита (со значением 0). Поэтому в регистр
СХ попадает двоичное значение 0 000 000 111 110 100. Во втором примере микропроцессор 8×86
загружает в регистр CL 8-битовое двоичное представление 11 100 010 десятичного числа –30.
Режимы адресации памяти
Доступ к ячейкам памяти обеспечивается взаимодействием операционного блока и
интерфейса шины микропроцессора 8×86. Когда операционному блоку требуется прочитать или
записать значение операнда, находящегося в памяти, он передает значение смещения адреса
интерфейсу шины. Последний добавляет это смещение к содержимому регистра сегмента
(предварительно дополненному четырьмя нулями) и тем самым получает 20-битовый
физический адрес, который и используется для доступа к операнду.
Исполнительный адрес
Смещение, которое вычисляется операционным блоком для доступа к находящемуся в
памяти операнду, называется исполнительным адресом операнда. Исполнительный адрес
показывает, на каком расстоянии (в байтах) располагается операнд от начала сегмента, в котором
он находится. Будучи 16-битовым числом без знака, исполнительный адрес позволяет получить
доступ к операндам, находящимся выше начала сегмента на расстоянии до 65535 (или 64К)
байтов.
Практическое задание _3
Время, затрачиваемое операционным блоком на вычисление исполнительного адреса,
является одним из основных компонентов общего времени исполнения команды. В зависимости
от используемого режима адресации получение исполнительного адреса может заключаться
всего лишь в извлечении его как составной части команды, но иногда могут потребоваться
довольно долгие манипуляции, например сложение извлеченной из команды составляющей с
регистром базы и с индексным регистром. Даже если время исполнения не является критичным
для Вашей программы, стоит оценивать эти временные факторы в процессе чтения следующих
ниже описаний режимов адресации.
Прямая адресация
При прямой адресации исполнительный адрес является составной частью команды (так
же, как значения при непосредственной адресации). Микропроцессор 8×86 добавляет этот
исполнительный адрес к сдвинутому содержимому регистра сегмента данных DS и получает 20-
битовый физический адрес операнда.
Обычно прямая адресация применяется, если операндом служит метка. Например, команда
MOV AX,TABLE
загружает содержимое ячейки памяти TABLE в регистр АХ. На рис. 1 показана схема
исполнения этой команды. Обратите внимание на то, что против ожидания микропроцессор 8×86
заполняет данные в памяти в обратном порядке. Старший байт слова следует за младшим
байтом, а не предшествует ему. Чтобы усвоить это, запомните, что старшая часть (старшие
биты) данных располагается в ячейках памяти со старшими адресами.
Рис. 1. Прямая адресация Рис. 2. Косвенная регистровая адресация
Косвенная регистровая адресация
При косвенной регистровой адресации исполнительный адрес операнда содержится в
базовом регистре ВХ, регистре указателя базы ВР или индексном регистре (SI или DI).
Косвенные регистровые операнды надо заключать в квадратные скобки, чтобы отличить их от
регистровых операндов. Например, команда
MOV AХ,[ВХ]
загружает в регистр АХ содержимое ячейки памяти, адресуемой значением регистра ВХ
(рис. 2).
Как поместить смещение адреса в регистр ВХ? Один из методов состоит в применении
команды LEA (Загрузить исполнительный адрес). Например, для загрузки слова из ячейки
TABLE в регистр АХ можно воспользоваться последовательностью команд
LEA BX, TABLE
MOV AХ,[ВХ]
Эти две команды выполняют те же действия, что и одна команда
MOV AX,TABLE
с той лишь разницей, что в первом случае предыдущее содержимое регистра ВХ
уничтожается. Если Вам нужен доступ лишь к одной ячейке памяти (в данном случае TABLE), то
Практическое задание _3
разумнее воспользоваться одной командой. Однако для доступа к нескольким ячейкам, начиная с
данного базового адреса, гораздо лучше иметь исполнительный адрес в регистре. Почему?
Потому что содержимым регистра можно манипулировать, не извлекая каждый раз новый адрес.
Адресация по базе
При адресации по базе Ассемблер вычисляет исполнительный адрес с помощью сложения
значения сдвига с содержимым регистров ВХ или ВР.
Регистр ВХ удобно использовать при доступе к структурированным записям данных,
расположенным в разных областях памяти. В этом случае базовый адрес записи помещается в
базовый регистр ВХ и доступ к ее отдельным элементам осуществляется по их сдвигу
относительно базы. А для доступа к разным записям одной и той же структуры достаточно
соответствующим образом изменить содержимое базового регистра.
Предположим, например, что требуется прочитать с диска учетные записи для ряда
работников. При этом каждая запись содержит табельный номер работника, номер отдела, номер
группы, возраст, тарифную ставку и т.д. Если номер отдела хранится в пятом и шестом бантах
записи, а начальный адрес записи содержится в регистре ВХ, то команда
MOV AХ,[ВХ]+4
загрузит в регистр АХ номер отдела, в котором служит данный работник (рис. 3). (Сдвиг
равен 4, а не 5, потому что первый байт записи имеет номер 0.)
Ассемблер позволяет указывать адресуемые по базе операнды тремя разными способами.
Следующие команды эквивалентны:
MOV AХ,[ВР]+4 ;3то стандартная форма записи,
MOV AХ,4[ВР] ; но сдвиг можно указать на первом месте
MOV AХ,[ВР+4] ; или внутри скобок
Рис. 3. Адресация по базе Рис. 4. Прямая адресация с индексированием
Прямая адресация с индексированием
При прямой адресации с индексированием исполнительный адрес вычисляется как сумма
значений сдвига и индексного регистра (DI или SI). Этот тип адресации удобен для доступа к
элементам таблицы, когда сдвиг указывает на начало таблицы, а индексный регистр – на ее
элемент.
Например, если B_TABLE — таблица байтов, то последовательность команд
MOV DI,2
MOV AL,В_TABLE[DI]
загрузит третий элемент таблицы в регистр AL.
В таблице слов соседние элементы отстоят друг от друга на два байта, поэтому при работе
с ней надо удваивать номер элемента при вычислении значения индекса. Если TABLE —
таблица слов, то для загрузки в регистр АХ ее третьего элемента надо использовать
последовательность команд
Практическое задание _3
MOV DI,4
MOV AХ,TABLE[DI]
(рис. 4).
Адресация по базе с индексированием
При адресации по базе с индексированием исполнительный адрес вычисляется как сумма
значений базового регистра, индексного регистра и, возможно, сдвига.
Так как в этом режиме адресации складывается два отдельных смещения, то он удобен
при адресации двумерных массивов, когда базовый регистр содержит начальный адрес массива,
а значения сдвига и индексного регистра суть смещения по строке и столбцу.
Предположим, например, что Ваша ЭВМ следит за шестью предохранительными
клапанами на химическом предприятии. Она считывает их состояния каждые полчаса и
запоминает в ячейках памяти. За неделю эти считывания образуют массив, состоящий из 336
блоков (48 считываний в течение семи дней) по шесть элементов в каждом, а всего — 2016
значений.
Если начальный адрес массива загружен в регистр ВХ, сдвиг блока (номер считывания,
умноженный на 12) – в регистре DI, а номер клапана задан в переменной VALVE, то команда
MOV AX ,VALVE[BX][DI ]
загрузит требуемое считывание состояния клапана в регистр АХ. На рис. 5 изображен процесс
извлечения результата третьего считывания (с номером 2) для клапана 4 из массива, у которого
смещение в сегменте данных равно 100Н.
Приведем несколько допустимых форматов операндов, адресуемых по базе с
индексированием:
MOVEAX,[BX+2+DI]
MOVEAX,[DI+BX+2]
MOVEAX,[BX+2][DI]
MOVEAX,[BX][DI+2
Для выполнения поставленной задачи, давайте разберем ее по шагам:
Шаг 1: Анализ задачи
Задача состоит из нескольких пунктов:
- Написать программу на языке Ассемблер с использованием различных режимов адресации.
- Создать исполняемый файл и проследить за его работой в отладчике Turbo Debugger.
- Зафиксировать значения операнда-приемника до и после выполнения команд в таблице.
- Выполнить задание варианта из приложения и также зафиксировать значения.
Шаг 2: Разработка структуры программы
Программа будет использовать разные режимы адресации. Предлагается следующий общий план программы:
- Сегмент данных: Определяем переменные, которые будут использоваться в программе.
- Сегмент кода: Написание кода с использованием различных режимов адресации (регистровая, непосредственная, прямая и т.д.).
- Запись значений: Фиксация значений операнда-приемника до и после выполнения каждой команды.
Шаг 3: Пример программы
Вот пример программы на Ассемблере, использующей несколько режимов адресации:
.model small
.stack 100h
.data
num1 dw 10 ; Пример переменной в памяти
num2 dw 20 ; Вторая переменная
result dw ? ; Переменная для хранения результата
.code
main proc
mov ax, @data ; Загрузка сегмента данных
mov ds, ax
; Пример регистровой адресации
mov ax, num1 ; AX = num1 (10)
mov bx, num2 ; BX = num2 (20)
; Пример арифметической операции
add ax, bx ; AX = AX + BX (30)
mov result, ax; Сохраняем результат в памяти
; Пример непосредственной адресации
mov bx, 50 ; BX = 50
; Пример прямой адресации
mov ax, [num1] ; AX = num1 (10)
; Завершение программы
mov ax, 4C00h ; Выход из программы
int 21h
main endp
end main
Шаг 4: Запуск в отладчике
- Скомпилируйте программу в исполняемый файл, например, с помощью MASM или TASM.
- Запустите Turbo Debugger и загрузите созданный исполняемый файл.
- Изучите значения регистров и переменных до и после выполнения каждой команды, чтобы заполнить таблицу.
Шаг 5: Заполнение таблицы
В таблице 1 фиксируем значения операнда-приемника до и после выполнения команды:
Таблица 1
Оператор Операнд-приемник
1. mov ax, num1 до: 0 после: 10
2. mov bx, num2 до: 0 после: 20
3. add ax, bx до: 10 после: 30
4. mov result, ax до: ? после: 30
5. mov bx, 50 до: 20 после: 50
Шаг 6: Выполнение задания варианта
В зависимости от задания варианта из приложения, добавьте нужные операции и фиксируйте результаты аналогично.
Заключение
Проверяйте каждую команду в отладчике, чтобы убедиться, что программа работает корректно и значения в таблице соответствуют фактическому поведению программы.
Если у вас есть конкретные вопросы по коду или требуются уточнения, задавайте.
Ответь на вопросы в формате word: 1. Что понимается под режимом адресации?
2. Что необходимо указать для описания метода адресации?
3. В чем заключается сущность регистрового режима адресации?
4. В чем заключается сущность косвенного регистрового режима адресации?
5. В чем заключается сущность прямого режима адресации?
6. В чем заключается сущность непосредственного режима адресации?
7. В чем заключается сущность базового режима адресации?
8. В чем заключается сущность индексного режима адресации?
9. В чем заключается сущность базового индексного режима адресации?
Вот ответы на ваши вопросы:
-
Что понимается под режимом адресации?
Режим адресации — это способ, которым команда процессора получает доступ к операндам, используемым в вычислениях. Он определяет, как интерпретировать операнды в машинных командах и как получить доступ к данным в памяти или регистрах. -
Что необходимо указать для описания метода адресации?
Для описания метода адресации необходимо указать, как операнд будет найден и использован процессором. Это может включать указание на регистр, указатель на память, непосредственное значение и другие механизмы доступа к данным. -
В чем заключается сущность регистрового режима адресации?
В регистровом режиме адресации операнд находится в одном из регистров процессора. Операция выполняется непосредственно над данными, находящимися в регистре, что делает этот метод быстрым и эффективным. -
В чем заключается сущность косвенного регистрового режима адресации?
В косвенном регистровом режиме адресации регистр содержит адрес в памяти, по которому находятся данные. Таким образом, регистр используется как указатель на память, откуда извлекается фактический операнд. -
В чем заключается сущность прямого режима адресации?
В прямом режиме адресации команда содержит адрес памяти, где располагается операнд. Это позволяет получить доступ к операндам, находящимся непосредственно в памяти. -
В чем заключается сущность непосредственного режима адресации?
В непосредственном режиме адресации операнд является частью самой команды и передается как константа. Этот режим используется, когда значение известно заранее и не требует извлечения из памяти или регистра. -
В чем заключается сущность базового режима адресации?
В базовом режиме адресации используется базовый регистр, который хранит начальный адрес, к которому добавляется смещение для получения адреса операнда в памяти. -
В чем заключается сущность индексного режима адресации?
В индексном режиме адресации используется индексный регистр, который добавляется к базовому адресу или смещению для расчета фактического адреса операнда. Это полезно для доступа к элементам массивов. -
В чем заключается сущность базового индексного режима адресации?
Базовый индексный режим адресации сочетает в себе базовый и индексный режимы, используя оба регистра: базовый регистр для хранения начального адреса и индексный регистр для смещения. Это позволяет более гибко обращаться к сложным структурам данных в памяти.
Если у вас есть дополнительные вопросы или требуется более детальная информация, дайте знать!
Вот постановка задачи :
Для выполнения задачи нужно написать программу на языке Ассемблер, используя указанные данные и режимы адресации. Вот пример программы:
.model small
.stack 100h
.data
B_TAB db 1Ah, 2Bh, 3Ch, 4Dh, 5Eh, 6Fh, 7Ah, 8Bh
W_TAB dw 1234h, 3C4Dh, 5F67h, 7A88h
B_TAB1 db 0Ah, 8 dup(?)
W_TAB2 dw 11h, 12h, 13h, 14h, 15h, 16h, 17h, 18h
.code
main proc
mov ax, @data
mov ds, ax
; Пример использования различных режимов адресации
; Режим: регистр - память
mov al, B_TAB[0] ; AL = 1Ah
mov B_TAB1[0], al ; B_TAB1[0] = 1Ah
; Режим: память - регистр
mov ax, W_TAB[0] ; AX = 1234h
mov W_TAB2[0], ax ; W_TAB2[0] = 1234h
; Пример непосредственной адресации
mov cx, 5 ; CX = 5
; Пример косвенного регистрового режима адресации
lea si, B_TAB ; SI указывает на начало B_TAB
mov al, [si] ; AL = 1Ah
inc si
mov al, [si] ; AL = 2Bh
; Пример базового индексного режима адресации
mov bx, offset W_TAB
mov di, 2
mov ax, [bx+di*2] ; AX = 5F67h
; Завершение программы
mov ax, 4C00h
int 21h
main endp
end main
Объяснение:
- Сегмент данных: Определены массивы и переменные.
- Режимы адресации: Программа демонстрирует использование различных режимов адресации, включая регистр-память, память-регистр, непосредственный, косвенный регистровый и базово-индексный режимы.
- Таблица 1: Вам нужно самостоятельно заполнить таблицу значениями операнда-приемника до и после выполнения каждой команды, используя отладчик.
Рекомендации:
- Компиляция и отладка: Используйте MASM/TASM для компиляции и Turbo Debugger для отладки.
- Заполнение таблицы: Выполняйте программу пошагово в отладчике, фиксируя значения переменных и регистров до и после выполнения каждой команды.
Если нужны дополнительные пояснения, обращайтесь!
Теперь посторой таблицу согласно постановке задачи
Для выполнения задачи и заполнения таблицы, давайте представим, как могут выглядеть значения операнда-приемника до и после выполнения некоторых операций. Это пример, который вы можете использовать, чтобы заполнить таблицу, наблюдая за программой в отладчике.
Таблица 1
Оператор | Операнд-приемник | До выполнения | После выполнения |
---|---|---|---|
mov al, B_TAB[0] |
AL | ?? | 1Ah |
mov B_TAB1[0], al |
B_TAB1[0] | ?? | 1Ah |
mov ax, W_TAB[0] |
AX | ?? | 1234h |
mov W_TAB2[0], ax |
W_TAB2[0] | ?? | 1234h |
mov cx, 5 |
CX | ?? | 5 |
mov al, [si] |
AL | ?? | 1Ah |
mov ax, [bx+di*2] |
AX | ?? | 5F67h |
Объяснение:
- До выполнения: Значение регистров и переменных до выполнения команды может быть неизвестным (помечено как
??
). - После выполнения: Значения, которые получаются после выполнения команды, указаны справа.
Используйте эти примеры и запустите программу в отладчике, чтобы получить фактические значения и заполнить таблицу полностью.
#chats