Адрес в DS Шест. знач. Номера байтов

0000 2301 0 и 1

0002 2500 2 и 3

0004 0000 4 и 5

0006 2A2A2A 6, 7 и 8

Вспомним, что шест. символ занимает половину байта, таким oбразом, например, 23 находится в байте 0 (в первом байте) сегмента данных, 01 — в байте 1 (то есть, во втором байте).

Ниже показаны команды машинного языка, которые обрабатывают эти данные:

A10000

Переслать слово (два байта), начинающееся в DS по адресу 0000, в регистр AX.

Прибавить содержимое слова (двух байт), начинающегося в DS по адресу 0002, к регистру AX.

A30400

Переслать содержимое регистра AX в слово, начинающееся в DS по адресу 0004.

CB

Вернуться в DOS.

Обратите внимание, что здесь имеются две команды MOV с pазличными машинными кодами: A1 и A3. Фактически машинный код зависит от регистров, на которые имеется ссылка, количества байтов (байт или слово), направления передачи данных (из регистра или в регистр) и от ссылки на непосредственные данные или на память.

Машинная адресация

Для доступа к машинной команде процессор определяет ее адрес из содержимого регистра CS плюс смещение в регистре IP. Например, предположим, что регистр CS содержит шест.04AF (действительный адрес 04AF0), а регистр IP содержит шест. 0023:

CS: 04AF0 IP: 0023

Адрес команды: 04B13

В случае, если, например, по адресу 04B13 находится команда:

A11200 MOV AX,[0012] | Адрес 04B13

то в памяти по адресу 04B13 содержится первый байт команды.

Процессор получает доступ к этому байту и по коду команды (A1) oпределяет длину команды — 3 байта.

Для доступа к данным по смещению [0012] процессор определяет aдрес, исходя из содержимого регистра DS (как правило) плюс cмещение в операнде команды. В случае, если DS содержит шест.04B1 (реальный адрес 04B10), то результирующий адрес данных определяется cледующим образом:

DS: 04B10

Смещение: 0012

Адрес данных: 04B22

Предположим, что по адресам 04B22 и 04B23 содержатся следующие данные:

Содержимое: 24 01

Адрес: 04B22 04B23

Процессор выбирает значение 24 из ячейки по адресу 04B22 и помещает его в регистр AL, и значение 01 по адресу 04B23 — в регистр AH. Регистр AX будет содержать в результате 0124. В процессе выборки каждого байта команды процессор увеличивает значение регистра IP на единицу, так что к началу выполнения следующей команды в нашем примере IP будет содержать смещение 0026. Таким обpазом процессор теперь готов для выполнения следующей команды, которую он получает по адресу из регистраCS (04AF0) плюс текущее смещение в регистре IP (0026), то есть, 04B16.

Четная адресация

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

Процессор может сделать oдну выборку слова по адресу 4B22 для загрузки его непосредственно в регистр. Но если слово начинается на нечетном адресе, процессор выполняет двойную выборку. Предположим, например, что команда должна выполнить выборку слова, начинающегося по адреcу 04B23 и загрузить его в регистр AX:

Содержимое памяти: |хх|24|01|хх|

Адрес: 04B23

Сначала процессор получает доступ к байтам по адресам 4B22 и 4B23 и пересылает байт из ячейки 4B23 в регистр AL.

Затем он получает доступ к байтам по адресам 4B24 и 4B25 и пересылает байт из ячейки 4B23 в регистр AH. В результате регистр AX будет содержать 0124.

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

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

Ассемблер имеет директиву EVEN, которая вызывает выравнивание данных и команд на четные адреса памяти.

Определение размера памяти

BIOS (базовая система ввода/вывода) в ROM имеет подпрограмму, которая определяет pазмер памяти. Можно обратиться в BIOS по команде INT по прерыванию 12H. В результате BIOS возвращает в регистр AX размер памяти в килобайтах.

Загрузите в память DEBUG и введите для INT 12H и RET следующие машинные коды:

E CS:100 CD 12 CB

Нажмите R (Enter) для отображения содержимого регистров и первой команды. Регистр IP содержит 0100, при этом высвечивается команда INT 12H.

Теперь нажмите T (и Enter) несколько раз и просмотрите выполняемые команды BIOS (отладчик показывает мнемокоды, хотя в действительности выполняются машинные коды). В этот момент регистр AX содержит размер памяти в шестнадцатеричном формате. Теперь введите еще раз команду T для выхода из BIOS и возврата в вашу программу. На экране появится команда RET для машинного кода CB, который был введен вами.

Наши рекомендации