- П-14 -
_BSS ENDS ; лизированных данных
; (DGROUP)
STACK SEGMENT PARA STACK 'STACK' ; сегмент стека
; (DGROUP)
STACK ENDS
;;
IFNB
@Stack stack_size
;;
ENDIF ;; конец обработки прохода
;;
DGROUP GROUP _DATA,CONST,_BSS,STACK ; группирование
; сегментов данных
;;
;; Назначить физические сегменты:
ASSUME cs:_TEXT, ds:DGROUP, ss:DGROUP, es:DGROUP
;;
ENDM ;; конец макроопределения
ENDIF ;; конец обработки прохода
;;
;;** @Medium ******** Макрокоманды общего назначения **
;; Управляющая макрокоманда для установки средней модели
;; памяти. (Эта макрокоманда вызывается через "@Model
;; medium". Эта макрокоманда может быть вызвана также
;; непосредственно.)
IF1 ;; Ассемблировать только в процессе прохода 1
@MediumModel MACRO code_name,stack_size
MEMODEL = 2
code_name_TEXT SEGMENT BYTE PUBLIC 'CODE' ;поименованный
; сегмент программы
code_name_TEXT ENDS ;
_DATA SEGMENT WORD PUBLIC 'DATA' ; сегмент данных
_DATA ENDS ; (DGROUP)
CONST SEGMENT WORD PUBLIC 'CONST' ; сегмент констант
CONST ENDS ; (DGROUP)
_BSS SEGMENT WORD PUBLIC 'BSS' ; сегмент непроинициа-
_BSS ENDS ; лизированных данных
; (DGROUP)
STACK SEGMENT PARA STACK 'STACK' ; сегмент стека
STACK ENDS ; (DGROUP)
;;
IFNB
@Stack stack_size
ENDIF
;;
DGROUP GROUP _DATA,CONST,_BSS,STACK ; группирование
; сегмента данных
;;
;; Hазначить физические сегменты
ASSUME cs:_TEXT, ds:DGROUP, ss:DGROUP, es:DGROUP
;;
ENDM ;; конец макроопределения
ENDIF ;; конец обработки прохода
;;
;;** @COMPACT ****** Mакрокоманды общего назначения **
;; Управляющая макрокоманда для установки компактной
;; (COMPACT) модели памяти. (Эта макрокоманда вызывается
- П-15 -
;; через "@Model compact". Эта макрокоманда может быть
;; вызвана также непосредственно.)
IF1 ;; Ассемблировать только в процессе прохода 1
@CompactModel MACRO stack_size
MEMODEL = 3
_TEXT SEGMENT BYTE PUBLIC 'CODE' ;сегмент текста программы
_TEXT ENDS
FAR_DATA SEGMENT PARA 'FAR_DATA' ; личный далекий сегмент
FAR_DATA ENDS ; данных (DGROUP)
FAR_BSS SEGMENT PARA 'FAR_BSS' ; личный далекий непро-
FAR_BSS ENDS ; инициализированный сег-
; мент данных (DGROUP)
_DATA SEGMENT WORD PUBLICK 'DATA' ; сегмент данных
_DATA ENDS ; (DGROUP)
CONST SEGMENT WORD PUBLIBC 'CONST' ; сегмент констант
CONST ENDS ; (DGROUP)
_BSS SEGMENT WORD PUBLIC 'BSS' ; сегмент непроинициа-
_BSS ENDS ; лизированных данных
; (DGROUP)
STACK SEGMENT PARA STACK 'STACK' ; сегмент стека
STACK ENDS ; (DGROUP)
;;
IFNB
@Stack stack_size
ENDIF
;;
DGROUP GROUP _DATA,CONST,_BSS,STACK ; группирование
; сегментов данных
;;
;; Назначить физические сегменты:
ASSUME cs:_TEXT,ds:DGROUP, ss:DGROUP,es:DGROUP
;;
ENDM ;; конец макроопределения
ENDIF ;; конец обработки прохода
;;
;;** @Large ***************** Mакрокоманды общего назначения **
;; Управляющая макрокоманда для установки большой (LARGE)
;; модели памяти. (Эта макрокоманда вызывается
;; через "@Model Large". Эта макрокоманда может быть
;; вызвана также непосредственно.)
IF1 ;; Ассемблировать только в процессе прохода 1
@LargeModel MACRO code_name,stack_size
MEMODEL = 4
code_name_TEXT SEGMENT BYTE PUBLIC 'CODE' ; поименованный
code_name_TEXT ENDS ; сегмент программы
FAR_DATA SEGMENT PARA 'FAR_DATA' ; личный далекий сегмент
FAR_DATA ENDS ; данных (DGROUP)
FAR_BSS SEGMENT PARA 'FAR_BSS' ; личный далекий непро-
FAR_BSS ENDS ; инициализированный сег-
; мент данных (DGROUP)
_DATA SEGMENT WORD PUBLIC 'DATA' ; сегмент данных
_DATA ENDS ; (DGROUP)
CONST SEGMENT WORD PUBLIC 'CONST' ; сегмент констант
CONST ENDS ; (DGROUP)
_BSS SEGMENT WORD PUBLIC 'BSS' ; сегмент непроинициа-
_BSS ENDS ; лизированных данных
; (DGROUP)
- П-16 -
STACK SEGMENT PARA STACK 'STACK' ; сегмент стека
STACK ENDS ; (DGROUP)
;;
IFNB
@Stack stack_size
ENDIF
;;
DGROUP GROUP _DATA,CONST,_BSS,STACK ; группирование
; сегмента данных
;;
;; Назначить физические сегменты
ASSUME cs:_TEXT,ds:DGROUP, ss:DGROUP,es:DGROUP
;;
ENDM ;; конец макроопределения
ENDIF ;; конец обработки прохода
;;
;;** @HUGE ************* Mакрокоманды общего назначения **
;; Управляющая макрокоманда для установки очень большой
;; (HUGE) модели памяти. (Эта макрокоманда вызывается
;; через "@Model huge". Эта макрокоманда может быть
;; вызвана также непосредственно.)
;; Oчень большая (HUGE) модель памяти в настоящее время
;; устанавливается так же как и Большая (LARGE) модель
;; памяти.
IF1 ;; Ассемблировать только в процессе прохода 1
@HugeModel MACRO code_name,stack_size
MEMODAL = 5
@LargeModel code_name,stack_size
ENDM ;; конец макроопределения
ENDIF ;; конец обработки прохода
;;
;;** @Stack ************* Mакрокоманды общего назначения **
;; Управляющая макрокоманда для установки размера стека
IF1 ;; Ассемблировать только в процессе прохода 1
@Stack MACRO stack_size,prog_type
;;
IFB ;; если параметр типа программы пустой
IF MEMODEL EQ 0
PROGTYPE = 0
ELSE
IF MEMODEL EQ 1
PROGTYPE = 1
ELSE
IF MEMODEL EQ 2
PROGTYPE = 1
ELSE
IF MEMODEL EQ 4
PROGTYPE = 1
ELSE
IF MEMODEL EQ 5
PROGTYPE = 1
ELSE
.ERR
%OUT @Stack macro: модель памяти
%OUT или тип программы не были установлены
- П-17 -
ENDIF;; конец проверки очень большой модели
ENDIF ;; конец проверки большой модели
ENDIF ;; конец проверки компактной модели
ENDIF ;; конец проверки средней модели
ENDIF ;; конец проверки малой модели
ENDIF ;; конец проверки очень маленькой модели
ELSE ;; параметр типа программы был указан
IF prog_type EQ 0 ;; установка программы типа .COM
PROGTYPE = 0
ELSE
IF prog_type EQ 1
PROGTYPE = 1
ELSE
.ERR ;; выход с сообщением об ошибке
%OUT @Stack macro: указан некорректный тип программы
ENDIF ;; конец проверки типа .EXE
ENDIF ;; конец проверки типа .COM
ENDIF ;; конец проверки параметра "тип-программы"
;;
IFNB
;;
IF PROGTYPE EQ 0
; Дополнительный стек. BHИМAHИЕ - вы должны ис-
; пользовать функцию 4h для завершения данной
; программы, если вы используете локальный стек.
db stack_size DUP ('стек ')
top_of_stack EQU $
ELSE ;; тип программы - .EXE
STACK SEGMENT
db stack_size DUP ('стек ')
STACK ENDS
ENDIF ;; конец проверки PROGTYPE
;;
ELSE ;; параметр "размер-стека" не был указан
;;
IF PROGTYPE EQ 0
; Дополнительный стек. ВНИМАНИЕ - вы должны исполь-
; зовать функцию 4h для завершения данной программы
; в случае использования локального стека !
db 32 DUP ('стек ')
top_of_stack EQU $
ELSE ;; тип программы - .EXE
STACK SEGMENT
db 32 DUP ('стек ')
STACK ENDS
ENDIF ;; конец проверки PROGTYPE
ENDIF ;; конец проверки "размера стека"
;;
ENDM ;; конец макроопределения
ENDIF ;; конец выполнения прохода
;;
;;** @SwapNewStack ******** Mакрокоманды общего назначения **
;; Переключить стек на новый стек
IF1 ;; Ассемблировать только в процессе прохода 1
@SwapNewStack MACRO tos
LOCAL bypass
;;
- П-18 -
jmp bypass ;; пропустить область данных
old_stk_seg dw ? ;; пространство для
;; сегмента стека вызывающей макрокоманды
old_stk_ptr dw ? ;; пространство для
; указателя стека вызывающей макрокоманды
new_stk_seg dw ? ;; пространство для
;; нового сегмента стека
new_stk_ptr dw offset tos ;; пространство для
;; нового указателя стека
;;
bypass:
mov cs:new_stk_seg,cs ;; установить сегмент