Иллюстрированный самоучитель по Assembler


Использование средств 32-разрядных процессоров в программировании - часть 9


Как уже отмечалось, в 32-разрядных процессорах увеличено до 4 число сегментных регистров данных. Это дает возможность совместной работы с четырьмя сегментами данных (общим объемом до 256 Кбайт) без перенастройки сегментных регистров. Структура такого рода программы может выглядеть следующим образом:

.586

datal segment use16

first dw 7000h dup(')

datal ends

data2 segment use6

second dw 7000h dup (')

data2 ends

data3 segment use16

third dw 7000h dup (')

data3 ends

data4 segment use16

forth dw 7000h dup (')

data4 ends

code segment use16

assume DS:datal,ES:data2,FS:data3,GS:data4

main proc

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

; соответствующих сегментов

mov AX,datal ;DS->datal

mov word ptr[BX],1111h ;Обращение через DS по умолчанию

;Обращение к разным сегментам с явным указанием

;требуемого сегментного регистра (замена сегмента)

mov word ptr ES:[BX],2222h

mov word ptr FS:[BX],3333h

mov word ptr GS:[BX],4444h

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

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

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

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

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

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

push first

pop second+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 для данного сегмента. Так, команда




Начало  Назад  Вперед



Книжный магазин