Для решения щадачи тебе нужно для начала это все считать : ПРАКТИЧЕСКОЕ ЗАНЯТИЕ _3
ОСНОВНЫЕ ТИПЫ ДАННЫХ. СПОСОБЫ АДРЕСАЦИИ
Цель работы:
 Практическое овладение навыками разработки программного кода на языке Ассемблер.
Изучение различных способов Практическое освоение основных функций отладчика TD.
адресации операндов.
 Написать программу согласно заданию
 Ответить на контрольные вопросы
Постановка задачи:

  1. Написать программу с именем Prog_№.asm используя различные виды режимов
    адресации, сделать исполняемый файл, и проследить за работой в Турбоотладчике
    (фрагмент программы Приложение 1).
  2. Опишите в сегменте данных следующую информацию:
  3. На основе работы программы в таблице 1, в графы 2 и 3 зафиксировать значение операнда
    приемника на каждом шаге программы.
    Таблица 1
    Оператор Операнд-приемник
    до выполнения После выполнения
    1 2 3
  4. Выполнить задание варианта (Приложение_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: Анализ задачи

Задача состоит из нескольких пунктов:

  1. Написать программу на языке Ассемблер с использованием различных режимов адресации.
  2. Создать исполняемый файл и проследить за его работой в отладчике Turbo Debugger.
  3. Зафиксировать значения операнда-приемника до и после выполнения команд в таблице.
  4. Выполнить задание варианта из приложения и также зафиксировать значения.

Шаг 2: Разработка структуры программы

Программа будет использовать разные режимы адресации. Предлагается следующий общий план программы:

  1. Сегмент данных: Определяем переменные, которые будут использоваться в программе.
  2. Сегмент кода: Написание кода с использованием различных режимов адресации (регистровая, непосредственная, прямая и т.д.).
  3. Запись значений: Фиксация значений операнда-приемника до и после выполнения каждой команды.

Шаг 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: Запуск в отладчике

  1. Скомпилируйте программу в исполняемый файл, например, с помощью MASM или TASM.
  2. Запустите Turbo Debugger и загрузите созданный исполняемый файл.
  3. Изучите значения регистров и переменных до и после выполнения каждой команды, чтобы заполнить таблицу.

Шаг 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. В чем заключается сущность базового индексного режима адресации?

Вот ответы на ваши вопросы:

  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. Сегмент данных: Определены массивы и переменные.
  2. Режимы адресации: Программа демонстрирует использование различных режимов адресации, включая регистр-память, память-регистр, непосредственный, косвенный регистровый и базово-индексный режимы.
  3. Таблица 1: Вам нужно самостоятельно заполнить таблицу значениями операнда-приемника до и после выполнения каждой команды, используя отладчик.

Рекомендации:

  1. Компиляция и отладка: Используйте MASM/TASM для компиляции и Turbo Debugger для отладки.
  2. Заполнение таблицы: Выполняйте программу пошагово в отладчике, фиксируя значения переменных и регистров до и после выполнения каждой команды.

Если нужны дополнительные пояснения, обращайтесь!

Теперь посторой таблицу согласно постановке задачи

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

Таблица 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

Объяснение:

  • До выполнения: Значение регистров и переменных до выполнения команды может быть неизвестным (помечено как ??).
  • После выполнения: Значения, которые получаются после выполнения команды, указаны справа.

Используйте эти примеры и запустите программу в отладчике, чтобы получить фактические значения и заполнить таблицу полностью.