Программа с несколькими сегментами данных
Часто относительно несложная программа обрабатывает значительные по объему массивы данных. В таких случаях требуется увеличивать число сегментов данных. При наличии нескольких сегментов данных возникают проблемы их адресации. Поскольку процессор имеет только 2 сегментных регистра данных DS и ES (в современных процессорах предусмотрены дополнительные сегментные регистры FS и GS), то в каждый момент времени в программе могут быть доступны только 2 сегмента данных общим объемом 128 Кб. Если число сегментов данных в программе больше 2, работать с ними придется последовательно, предварительно настраивая сегментные регистры данных на требуемую пару сегментов. Стек Стеком называют область программы для временного хранения произвольных данных. Отличительной особенностью стека является своеобразный порядок выборки содержащихся в нем данных: в любой момент времени в стеке доступен только элемент, загруженный в стек последним (дисциплина LIFO – Last In First Out). Элементы стека располагаются в области памяти, отведенной под стек, начиная со дна стека, то есть с его максимального адреса, по последовательно уменьшающимся адресам. Адрес верхнего доступного элемента хранится в регистре-указателе стека SP. Стек должен входить в один из имеющихся сегментов или образовывать отдельный сегмент. Сегментный адрес этого сегмента помещается в регистр SS. Таким образом, пара регистров SS и SP описывают адрес доступной ячейки стека: в SS хранится сегментный адрес стека, а в SP – относительный адрес текущей доступной ячейки (рисунок 3). Рисунок 3 – организация стека: а – исходное состояние, б – после загрузки первого элемента (в данном примере - содержимого регистра AX), в – после загрузка второго элемента (содержимого регистра DS), г – после выгрузки одного элемента, д – после выгрузки двух элементов и возврата в исходное состояние.
Загрузка в стек осуществляется специальной командой работы со стеком – push. Эта команда сначала уменьшает на 2 содержимое указателя стека, а затем помещает операнд по адресу, находящемуся в SP. Если, например, мы хотим временно сохранить в стеке содержимое регистра AX, следует выполнить команду: push AX Если спустя какое-то время нам понадобилось восстановить исходное содержимое сохраненных в стеке регистров, мы должны выполнить команду выгрузки из стека – pop: pop AX Модели памяти Модели памяти задаются директивой.MODEL так: .model модель,язык,модификатор 1. Модель — одно из следующих слов: · TINY — код, данные и стек размещаются в одном и том же сегменте размером до 64 Кб. Эта модель памяти чаще всего используется при написании на ассемблере небольших программ; · SMALL — код размещается в одном сегменте, а данные и стек — в другом (для их описания могут применяться разные сегменты, но объединенные в одну группу). Эту модель памяти также удобно использовать для создания программ на ассемблере; · COMPACT — код размещается в одном сегменте, а для хранения данных могут использоваться несколько сегментов, так что для обращения к данным требуется указывать сегмент и смещение (данные дальнего типа); · MEDIUM — код размещается в нескольких сегментах, а все данные — в одном, поэтому для доступа к данным используется только смещение, а вызовы подпрограмм применяют команды дальнего вызова процедуры; · LARGE и HUGE — и код, и данные могут занимать несколько сегментов; · FLAT — то же, что и TINY, но используются 32-битные сегменты, так что максимальный размер сегмента, содержащего и данные, и код, и стек, — 4 Мб. 2. Язык — необязательный операнд, принимающий значения C, PASCAL, BASIC, FORTRAN, SYSCALL и STDCALL. Если он указан, подразумевается, что процедуры рассчитаны на вызов из программ на соответствующем языке высокого уровня, следовательно, если указан язык C, все имена ассемблерных процедур, объявленных как PUBLIC, будут изменены так, чтобы начинаться с символа подчеркивания, как это принято в C.
3. Модификатор — необязательный операнд, принимающий значения NEARSTACK (по умолчанию) или FARSTACK. Во втором случае сегмент стека не будет объединяться в одну группу с сегментами данных. Процедуры Процедурой в ассемблере является все то, что в других языках называют подпрограммами, функциями, процедурами и т.д. Ассемблер не накладывает на процедуры никаких ограничений – на любой адрес программы можно передать управление командой CALL, и оно вернется к вызвавшей процедуре, как только встретится команда RET. Такая свобода выражения легко может приводить к трудночитаемым программам, и в язык ассемблера были включены директивы логического оформления процедур. метка proc язык тип USES регистры ... ret метка endp
Все операнды PROC необязательны. · Операнд язык определяет взаимодействие процедуры с языками высокого уровня. В некоторых ассемблерах директива PROC позволяет также считать параметры, передаваемые вызывающей программой. В этом случае указание языка необходимо, так как различные языки высокого уровня используют разные способы передачи параметров. · Тип может принимать значения NEAR и FAR, и если он указан, все команды RET в теле процедуры будут заменены соответственно на RETN и RETF. По умолчанию подразумевается, что процедура имеет тип NEAR в моделях памяти TINY, SMALL и COMPACT. · USES – список регистров, значения которых изменяет процедура. Ассемблер помещает в начало процедуры набор команд PUSH, а перед командой RET – набор команд POP, так что значения перечисленных регистров будут восстановлены. Раздел 2 Практическая часть
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|