SOURCE DB 10,20,30,40
DEST DB 4 DUP(?) DSEG ENDS; - в программе должно быть указание, какие сегментные регистры закрепляются за используемыми именами регистров, например: ASSUME CS: CSEG, DS: DSEG, SS: STACK. При исполнении программы адреса сегментных регистров CS, SS, ESв соответствии с вышеприведенными указаниями загружаются автоматически; - сегмент данных DS в EXE-программе не может быть загружен автоматически, поскольку он используется программой-загрузчиком LINK для формирования начального адреса служебной области памяти – префикса программного сегмента (PSP), непосредственно предшествующего любой исполняемой программе. PSP – это группа служебных слов в оперативной памяти, формируемая для каждой загружаемой программы пользователя и занимающая обычно 256 байт (100Н байт), именно адрес этой области записывается в регистр DS. Поэтому в самом начале исполняемой программы этот сегмент инициируется принудительно: сначала в стек записывается адрес возврата к служебной области в виде 2-ух слов – содержимого регистра DS и нулевого смещения; затем в регистр DS записывается адрес сегмента данных исполняемой программы, например, как показано ниже: PUSH DS; поместить в стек адрес PSP SUB AX, AX; обнулить регистр АХ PUSH AX; поместить в стек смещение адреса возврата=0 MOV AX, DSEG; инициировать адрес сегмента данных MOV DS, AX; загрузить адрес в регистр DS; - в исходной программе обязательно должна быть определена метка для первой команды, с которой начнется выполнение программы. Это может быть собственно метка или имя процедуры, как показано в приведенной ниже программе. Имя этой метки обязательно должно быть указано в конце программы в качестве операнда директивы END, например, END OUR_PROG; - обеспечение выхода из программы, например, используя функцию 4С прерывания 21Н, как показано ниже: MOV AX, 4C00Н INT 21H или оформив основную программу как процедуру с атрибутом FAR и стандартным выходом из процедуры RET, как показано в приведенной ниже программе. Пример 1 программы на Ассемблере TITLE EX_PROG PAGE, 132 STACK SEGMENT PARA STACK ‘STACK’ DB 64 DUP(‘STACK ’); Область стека STACK ENDS DSEG SEGMENT PARA PUBLIC ‘DATA’ SOURCE DB 10, 20, 30, 40; эта таблица будет скопирована DEST DB 4 DUP(?); в эту таблицу в обратном порядке DSEG ENDS SUBTTL ОСНОВНАЯ ПРОГРАММА PAGE CSEG SEGMENT PARA PUBLIC ‘CODE’ ASSUME CS: CSEG, DS: DSEG, SS: STACK OUR_PROG PROC FAR ; занести в стек такие начальные значения, чтобы программа ; могла возвратить управление отладчику PUSH DS; поместить в стек номер блока адреса возврата
|