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

Unknown Author

Рассмотренный способ задания адресов в командах называется сегментированием адресов (другое название - базирование адресов), а регистры, используемые для хранения начальных адресов сегментов памяти, - сегментными. В ПК в качестве сегментных регистров можно использовать не любой регистр, а только один из следующих четырех: CS, DS, SS и ES.

Более детально сегментирование адресов будет рассмотрено в гл. 7, а пока отметим лишь следующее.

В ПК размеры сегментов памяти не должны превышать 64 Кб (216 = 65536), поэтому смещения здесь - это 16-разрядные адреса. Поскольку сегментирование адресов применяется в отношении всех команд, операнды которых берутся из памяти, то в командах явно указываются только 16-разрядные адреса (смещения), а не "длинные" 20-разрядные адреса. Кроме того, в ПК принят ряд соглашений, которые позволяют во многих командах не указывать явно сегментные регистры. В связи с этим во многих программах, особенно небольших, можно ни разу не встретить 20-разрядные адреса и сегментные регистры, и создается впечатление, что ПК - это ЭВМ с 16-разрядными адресами. Учитывая это и не желая вначале усложнять рассказ про ПК сегментированием адресов, договоримся на первых порах считать, что в ПК используются только 16-разрядные адреса, и лишь позже (в гл. 7) мы вспомним, что в ПК настоящие адреса все-таки 20-разрядные. Одновременно договоримся термином "адрес" обозначать 16-разрядные адреса (смещения), указываемые в командах, а 20-разрядные адреса будем называть абсо-

лютными адресами (другое название - физические адреса). Таким образом, адреса меняются от OOOOh до FFFFh, а абсолютные адреса - от OOOOOh до FFFFFh.

Что касается упомянутых соглашений, принятых в ПК, то суть их в следующем: в регистре CS должен находиться начальный адрес сегмента команд - той области памяти, где расположены команды программы; регистр DS должен указывать на начато сегмента данных, в котором размещаются данные программы; регистр SS должен указывать на начато области памяти, отведенной под стек. Если так и сделать, тогда при ссылках на эти сегменты (команд, данных и стека) можно явно не указывать в командах соответствующие сегментные регистры (CS, DS и SS), они будут подразумеваться по умолчанию.

1.23. Указатель команд

Еще один регистр ПК

это регистр IP (instruction pointer, указатель команд):

сегмент команд

текущая команда

В этом регистре всегда находится адрес команды, которая должна быть выполнена следующей. Более точно, в IP находится адрес этой команды, отсчитанный от начала сегмента команд, на начато которого указывает регистр CS. Поэтому абсолютный адрес этой команды определяется парой регистров CS и IP. Изменение любого из этих регистров есть ничто иное, как переход. Поэтому содержимое регистра IP (как и CS) можно менять только командами перехода.