| |
BIGLIB |
| большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно |
|
| |
ФАНТАСТИКА |
| фентези,
фантастика, фантастические повести |
|
| |
ФИЛОСОФИЯ |
книги, которые заставляют
задуматься над окружающим тебя миром.
|
|
| |
МЕДИЦИНА |
медицинские книги,
методички,
народные лечебники |
|
| |
КУЛИНАРИЯ |
рецепты
тортов, консервирование,
все о спиртных
напитках. |
|
| |
СТИХИ |
| стихи популярных
и не очень авторов |
|
| |
ТВОРЧЕСТВО |
| народное творчество,
стихи, песни и т.д. |
|
| |
ЮМОР |
| анекдоты, приколы,
смешные истории |
|
| |
ЭРОТИКА |
| эротические рассказы,
книги о технике секса,
кама-сутра и др. |
|
|
| |
 |
ASSUME вы указали Турбо Ассемблеру, что нужно сделать такое допу-
щение. Директива ASSUME дает вам способ в любой момент сообщить
Ассемблеру о значении сегментного регистра, после чего Турбо Ас-
семблер будет сообщать вам, если вы пытаетесь сделать невозмож-
ное.
Однако Турбо Ассемблер не может перехватывать все подобные
ошибки. Когда в ссылке на память используется именованная пере-
менная памяти (такая, как Var1 и Var2 в предыдущем примере), Тур-
бо Ассемблер может проверить допустимость этой ссылки, так как
каждая именованная переменная памяти явным образом связана с сег-
ментом. Невозможно сообщить Турбо Ассемблеру, к какому сегменту
пытается обратиться инструкция:
mov al,[bx]
В этом случае Турбо Ассемблер должен предположить, что зна-
чение сегментного регистра DS соответствует тому сегменту, к ко-
торому вы хотите обратиться.
Если в данный момент сегментный регистр не указывает ни на
какой именованный сегмент, то чтобы сообщить об этом Ассемблеру,
можно использовать в директиве ASSUME ключевое слово NOTHING.
Например:
.
.
.
mov ax,0b800h
mov ds,ax
ASSUME ds:NOTHING
.
.
.
Здесь регистр DS устанавливается таким образом, чтобы указы-
вать на цветной графический экран, а затем Турбо Ассемблеру сооб-
щается, что регистр DS не указывает ни на какой именованный сег-
мент. Вот еще один способ ссылки на цветной графический экран:
.
.
.
ColorTextSeg SEGMENT AT 0B8000h
ColorTextMemory LABEL BYTE
ColorTextSeg ENDS
.
.
.
mov ax,ColorTextSeg
mov ds,ax
ASSUME ds:ColorTextSeg
.
.
.
Обратите внимание, что в директиве AT, которая следует за
директивой SEGMENT, задается явный начальный адрес сегмента.
Сделаем последнее замечание по директиве ASSUME: в некоторых
случаях она может привести к тому, что Турбо Ассемблер будет ис-
пользовать для доступа к памяти не тот сегментный регистр, кото-
рый вы ожидаете, а другой. Рассмотрим, например, следующий фраг-
мент программы:
.
.
.
Data1 SEGMENT WORD 'DATA'
Var1 DW 0
Data1 ENDS
Data2 SEGMENT WORD 'DATA'
Var2 DW 0
Data2 ENDS
Code SEGMENT WORD 'CODE'
ASSUME CS:Code
ProgramStart:
mov ax,Data1
mov ds,ax ; установить DS в Data1
ASSUME DS:Data1
mov ax,Data2
mov es,ax ; установить ES в Data2
ASSUME ES:Data2
mov ax,[Var2] ; загрузить Var2 в AX -
; Турбо Ассемблер укажет
; процессору 8086, что
; загрузку нужно выполнять
; относительно ES, так как
; к Var2 нельзя получить
; доступ относительно DS
.
.
.
mov ah,4ch ; функция DOS завершения
; работы программы
int 21h ; завершить программу
Code ENDS
END ProgramStart
Данный пример должен быть вам знаком: это модифицированная
версия фрагмента программы, использованного нами ранее для того,
чтобы показать, как директива ASSUME позволяет Турбо Ассемблеру
указать вам, когда вы пытаетесь использовать недопустимую ссылку
на память. Однако в данном примере сообщение об ошибке не выво-
дится. Но это не означает, что Турбо Ассемблер позволяет вам сде-
лать ошибку. Он модифицирует инструкцию:
mov ax,[Var2]
для доступа к Var2 относительно сегментного регистра ES, а не
сегментного регистра DS.
Это происходит по следующим причинам. Две директивы ASSUME
информируют Турбо Ассемблер о том, что регистр DS установлен в
значение сегмента Data1, а ES установлен в значение сегмента
Data2. Турбо Ассемблер совершенно правильно заключает, что к Var2
нельзя получить доступ относительно регистра DS, однако Var2 дос-
тупно относительно сегментного регистра ES. В итоге Турбо Ассем-
блер включает перед инструкцией MOV специальный код (префикс пе-
реопределения сегмента), чтобы указать процессору 8086, что вмес-
то сегментного регистра DS нужно использовать сегментный регистр
ES.
Какое все это имеет для вас значение? Это значит, что если
вы корректно используете директивы ASSUME, позволяя Турбо Ассем-
блеру узнать о текущих установленных для регистров DS и ES значе-
ниях, то он может автоматически вам помочь, проверяя возможность
доступа к именованным переменным в памяти и в некоторых случаях
даже может выполнить автоматическую корректировку сегмента.
Общее обсуждение префиксов переопределения сегментов и стан-
дартные директивы определения сегментов обсуждаются в Главе 10.
Стандартные или упрощенные директивы определения сегментов?
-----------------------------------------------------------------
Теперь, когда вы познакомились и с упрощенными, и со стан-
дартными директивами определения сегментов, возникает вопрос, ка-
кой набор директив определения сегментов следует использовать?
Ответ зависит от типа выполняемого программирования на Ассембле-
ре.
Если вы компонуете модули на Ассемблере с языками высокого
уровня, почти всегда желательно использовать упрощенные директивы
определения сегментов. Эти директивы выполняют всю работу по наи-
менованию сегментов и все функции, связанные с моделью памяти и
организации интерфейса с языками высокого уровня.
Если вы пишете большие автономные программы на Ассемблере,
используя много сегментов и смешанные модели памяти (код ближнего
и дальнего типа и/или данные ближнего и дальнего типа в одной
программе), то вам потребуется использовать стандартные директивы
определения сегментов, что позволит вам полностью управлять типом
сегмента, выравниванием, наименованием сегментов и способом их
комбинирования (сочетания).
Кратко можно сформулировать следующее правило: используйте
упрощенные директивы определения сегментов, пока вы не обнаружи-
те, что вам необходимо получить полное управление определениями
сегментов, которое может обеспечить только стандартное (полное)
определение сегментов.
Выделение данных
-----------------------------------------------------------------
Теперь, когда вы знаете, как создавать сегменты, давайте
рассмотрим, как можно заполнить эти сегменты осмысленными данны-
ми. Сегмент стека проблемы не представляет: там находится стек, а
к стеку вы можете обратиться с помощью инструкций PUSH и POP и
адресоваться через регистр BP. Сегмент кода заполняется инструк-
циями, которые генерируются в соответствии с мнемоникой инструк-
ций вашей программы, поэтому проблемы здесь также нет.
Остается сегмент данных. В Турбо Ассемблере предусмотрено
множество способов определения переменных в сегменте данных, как
инициализируемых некоторым значением, так и неинициализированных.
Чтобы понять, какие данные позволяет вам определять Турбо Ассемб-
лер, мы должны сначала немного рассказать вам основных типах дан-
ных Ассемблера.
Биты, байты и основания
-----------------------------------------------------------------
Основной единицей памяти компьютера является бит. В бите мо-
жет храниться значение 0 или 1. Бит сам по себе не особенно поле-
зен. Процессор 8086 не работает непосредственно с битами, он ра-
ботает с байтами, которые состоят из 8 бит.
Так как бит на самом деле представляет собой цифру с основа-
нием 3, байт содержит 8-разрядное число с основанием 2. Наиболь-
шие возможные числа с основанием 2 - это следующие числа:
2 в степени 0: 1
2 в степени 1: 2
2 в степени 2: 4
|
adfun.ru
|
|
|
|