Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 6

Unknown Author

Что же касается специализации регистра SP, то он используется при работе со стеком. Стек - это хранилище информации, функционирующее по правилу: первым из стека всегда считывается элемент, записанный в стек последним. Стек полезен во многих случаях, например, для реализации процедур. В ПК имеются команды, поддерживающие работу со стеком. Так вот, в этих командах предполагается, что регистр SP указывает на ячейку стека, в которой находится элемент, записанный в стек последним. (Более подробно работа со стеком рассматривается в гл. 8.)

Теперь отметим еще одну особенность регистров общего назначения. Среди них выделяются регистры АХ, ВХ, СХ и DX: они устроены так, что возможен независимый доступ к их старшей и младшей половинам; можно сказать, что каждый из этих регистров состоит из двух байтовых регистров. Обозначают эти половины буквами Н (high - выше, старший) и L (low - ниже, младший) и первой буквой из названия регистра: АН и AL - в АХ, ВН и BL - в ВХ и т. д. (см. рис. выше). Например, с регистром АХ можно работать так: можно записать в него слово (16 битов), затем можно считать только левую половину этого слова (байт из АН), не считывая правую половину, далее можно сделать запись только в AL, не меняя АН. Таким образом, возможен доступ как ко всему регистру АХ, так и к любой его половине. Целиком регистр используется при работе с числами, а его половины - при работе с частями чисел или символами.

Отметим, что на части делятся только регистры АХ, ВХ, СХ и DX. Запись же в другие регистры и чтение из них осуществляются только целиком.

1ЛЛ. Сегментные регистры

Вторую группу регистров образуют следующие 4 регистра:

DS

CS

ES

SS

названия которых расшифровываются так:

CS    code segment, сегмент команд;

DS    data segment, сегмент данных;

SS    stack segment, сегмент стека;

ES    extra segment, дополнительный сегмент.

Ни в каких арифметических, логических и т. п. операциях эти регистры не могут участвовать. Можно только записывать в них и считывать из них, да и то здесь есть определенные ограничения.

Эти регистры используются для сегментирования адресов, которое является разновидностью модификации адресов и которое используется для сокращения размера команд. Суть дела здесь в следующем.

Если в ЭВМ используется память большого объема, тогда для ссылок на ее ячейки приходится использовать "длинные" адреса, а поскольку эти адреса указываются в командах, то и команды оказываются "длинными". Это шюхо, т. к. увеличиваются размеры машинных программ. Сократить размеры команд при "длинных" адресах" можно, например, так. Любой адрес А можно представить в виде суммы B+D, где В - начальный адрес (база) того участка (сегмента) памяти, в котором находится ячейка A, a D - это смещение, адрес ячейки А, отсчитанный от начата этого сегмента (от В). Если сегменты памяти небольшие, тогда и величина D будет небольшой, поэтому большая часть "длинного" адреса А будет сосредоточена в базе В. Этим и можно воспользоваться: если в команде надо указать адрес А, тогда "упрятываем" базу В в какой-нибудь регистр S, а в команде вместо А указываем этот регистр и смещение D. Поскольку для записи D надо меньше места, чем для адреса А, то тем самым уменьшается размер команды. С другой стороны, благодаря модификации адресов данная команды будет работать с адресом, равным сумме D и содержимого регистра S, т. е. с нужным нам адресом А.