Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Финогенов-основы_языка_ассемблера.doc
Скачиваний:
26
Добавлен:
17.09.2019
Размер:
3.35 Mб
Скачать

Глава 4

mov word ptr ES:[BX],2222h

mov word ptr FS:[BX],3333h

mov word ptr GS:[BX],4444h

;Обращение по именам полей данных разных сегментов ;с учетом действия директивы assume

mov first, 1 ;3апись в сегмент datal

mov second,2 ;3апись в сегмент data2

mov third,3 ;3апись в сегмент data3

mov fourth,4 ;3апись в сегмент data4

;Перенос данных из сегмента в сегмент

push first

pop sccoud+2

push third

pop fourth+2

main endp code ends

В программе объявлены 4 сегмента данных с именами datal, data2, data3 и data4, содержащие массивы 16-разрядных данных с именами first, second, third и fourth. Длина каждого массива составляет 56 Кбайт, и, таким образом, общий объем данных, доступных программе в любой мо­мент, составляет более 200 Кбайт. Сегменты данных описаны до сегмента команд, что в данном случае имеет значение. В сегменте команд с помо­щью директивы assume указано соответствие каждом}' из сегментов свое­го сегментного регистра (DS, ES, FS и GS). Это даст нам возможность обращаться по именам полей сегментов без явного указания соответству­ющих этим сегментам сегментных регистров.

Программа начинается с обычной практически для всех программ процедуры настройки всех сегментных регистров. Стоит еще раз повто­ рить, что директива assume лишь обеспечивает правильную трансляцию программы, но не инициализирует сегментные регистры. «Правильная трансляция» в данном случае заключается в том, что при обработке ко­ манд, в которых упоминаются имена данных того или иного сегмента, ассемблер автоматически предваряет эти команды префиксом замены сег­ мента, выбирая для замены сегментный регистр, указанный в директиве assume для данного сегмента. Так, команда ;.

mov first,! )';

преобразуется в последовательность кодов (по листингу трансляции) С7 06 ООООг 0001

где С7 06 — это код команды mov в случае прямой адресации памяти и использования непосредственного операнда, ООООг — смещение адресуе­мой ячейки, а 0001 — непосредственный операнд (все числа, разумеется, шсстнадцатеричныс). Здесь нет префикса замены сегмента, потому что адресуется сегмент, которому соответствует регистр DS, используемый

Г

'дсишренные возможности современных микропроцессоров 175

процессором по умолчанию. Однако команды с обращением к другим сег­ментам транслируются с включением в их коды соответствующих пре­фиксов, несмотря на то, что в исходных предложениях не указаны сег­ментные регистры, а содержатся только ссылки на (уникальные) имена ячеек тех или иных сегментов:

mov second,2 ;Код команды 26: С7 06 ООООг 0002

mov third,3 ;Код команды 64: С7 06 ООООг 0003

mov fourth,4 ;Код команды 65: С7 06 ООООг 0004

Настроив сегментные регистры, мы можем обращаться к полям данных всех четырех сегментов с использованием любых способов адресации. В при­веденном фрагменте в регистр ВХ помещается смещение последней ячейки любого из массивов, после чего с помощью косвенной базовой адресации в последние слова всех четырех массивов записываются произвольные числа llllh, 2222h, 3333h и 4444h. Во всех случаях требуется описатель word ptr, так как по виду команды ассемблер не может определить, хотим ли мы занести в память байт, слово или двойное слово. При обращении к сегментам, адре­суемых не через DS, необходимо явное указание сегментного регистра (ко­торое будет преобразовано в код префикса замены сегмента), потому что по виду команды с адресацией через регистры транслятор не может опреде­лить, к какому сегменту происходит обращение.

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

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