Использование ранее определенных данных



Предыдущий пример использовал непосредственные данные, определенные прямо в директивах MOV и ADD. В этом примере данные (числовые константы 0123Н и 0025Н) определены в виде отдельных элементов данных в программе. Инструкции программы должны работать с ячейками памяти, содержащими эти значения.

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

 

Смещение в сегменте DS Шестнадцатеричный код содержимого

 

       0200H                                           2301Н

       0202H                                                2500Н

       0204H                                                0000Н

       0206H                                            2А2А2АН

Шестнадцатеричная цифра занимает полбайта, поэтому, например, 23Н хранится в байте с адресом 200Н, а 01H – в следующем (со смещением 201Н). Ниже приведены машинные инструкции, обрабатывающие эти данные, со значениями, введенными в обратной (с переставленными байтами) форме.

Инструкция                                           Объяснение

А10002          Поместить слово (2 байта), начинающееся с адреса DS:0200H, в

регистр АХ

03060202   Добавить содержимое слова (2 байта), начинающегося с адреса

DS:0202H, к содержимому регистра АХ

A30402          Поместить содержимое АХ в слово, начинающееся с адреса

DS:0204H

EBF4            Перейти к началу программы


Две инструкции по перемещению данных имеют разные машинные коды: А1 и A3. Действительный машинный код инструкции MOV зависит от регистров, на которые ссылается инструкция, размера элемента данных (байт или слово), направления передачи данных (в регистр или из регистра) и того, ссылается инструкция на непосредственные данные, адрес в памяти или регистр.

Ввод инструкций и данных программы

Используйте программу DEBUG для ввода и выполнения программы этого примера. Сначала с помощью команды Е введите инструкции, начиная с адреса CS:0100:

Е CS:100 A1 00 02 03 06 02 02 (и нажмите <Enter>)

Е CS:107 A3 04 02 ЕВ F4 (и нажмите <Enter>)

Теперь (также при помощи команды Е) введите соответствующие значения в ячейки сегмента данных:

Е DS:0200 23 01 25 00 00 00 (и нажмите <Enter>)

Е DS:0206 2А 2А 2А (и нажмите <Enter>)

Первая команда Е сохраняет три слова (6 байт) в начале области данных – начиная со смещения 0200Н. Все эти слова должны быть введены в форме с переставленными байтами, то есть 0123 как 2301 и 0025 как 2500. Когда в дальнейшем инструкция MOV запросит эти слова из памяти, байты будут переставлены опять, образуя исходные значения.

Вторая команда Е вводит в память три символа звездочки (***) в виде кода 2А2А2А. Вы сможете их увидеть в виде символов с помощью команды D.

 


Для просмотра данных в сегменте (со смещениями от 0200Н до 0208Н) и инструкций в сегменте CS (от 0100Н до 010АН) введите следующие команды D:

Для просмотра кода:         100,10A <Enter>

Для просмотра данных:      200,208 <Enter>

Выполнение инструкций программы

Введя инструкции, можно выполнять их тем же способом, что и в предыдущем примере. Сначала убедитесь, что IР содержит 0100Н. После этого командой R просмотрите содержимое регистров, флагов и код первой инструкции. Хотя АХ может все еще содержать значение, присвоенное ему в предыдущем примере, оно скоро будет заменено новым. Первая показанная инструкция

хххх:0100 А10002 M0V АХ,[0200]

CS:0100 указывает на первую инструкцию, А10002. DEBUG интерпретирует эту инструкцию как MOV и определяет, что она ссылается на ячейку со смещением [0200Н] в сегменте DS. Квадратные скобки указывают, что это не непосредственное значение, а адрес в памяти. (Непосредственное значение для записи в АХ выглядело бы как MOV AX,0200.)

Теперь введите команду Т. Инструкция выполняется и помещает значение слова со смещения 0200Н в регистр АХ. Содержимое этого слова – 2301Н, а инструкция переставляет байты и помещает его в регистр АХ в виде 0123Н, стирая любое предыдущее значение.

Введите вторую команду Т. Будет выполнена следующая инструкция, т.е. ADD. Операция добавляет значение из слова по адресу DS:0202H к значению регистра АХ. Результат – сумма 0123Н и 0025Н, то есть 0148Н.

Следующая инструкция – MOV [0204],АХ. Введите Т для ее исполнения. Инструкция копирует значение из регистра АХ в слово в памяти, занимающее ячейки с адресами 0204Н и 0205Н. При этом байты будут переставлены, и слово будет содержать значение 4801Н. Для просмотра изменившегося содержимого ячеек памяти введите команду

D DS:200,208 <Enter>

Выведенные значения должны быть такими:

Значение в ячейке: 23   01    25    00    48   01    2а      2а     2а

Смещение:        200 201 202 203 204 205 206 207 208

Левая сторона дисплея показывает действительный машинный код так, как он хранится в памяти. Правая сторона помогает легко находить символьные данные. Эти шестнадцатеричные значения представлены в правой части экрана соответствующими им символами ASCII. Коды 23Н и 25Н выводятся как # (символ номера) и % (символ процента) соответственно. Три байта 2АН выводятся как три звездочки (*).

Можно завершить работу с DEBUG командой Q или перейти к выполнению следующего примера.


Дата добавления: 2018-04-04; просмотров: 473; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!