Программирование и кодирование
файл Вашей программы, или могут постоянно размещаться в отдель-
ном файле, который "включается" в Ваш исходный файл в процессе
трансляции с языка ассемблера (путем встраивания управляющей ко-
манды INCLUDE макроассемблера MASM в исходный файл).
Листинг A-5. Шаблон .EXE-программы
----------------------------------------------------------------
PAGE 60,132 ; широкая печать
;- - - - - - - - - - - - - - - - - - - - - - - - - - - -
FALSE EQU 0 ; сравнить с логическим значением
; FALSE ("ложь")
TRUE EQU 0FFFFH ; сравнить и проверить по маске
; логическоe значениe TRUE
; ("истина")
;
; <Установление равенств и макрокоманд>
;
;- - - - Инициализация - - - - - - - - - - - -
_TEXT SEGMENT WORD PUBLIC 'CODE' ;сегмент текста программы
_TEXT ENDS
_DATA SEGMENT WORD PUBLIC 'DATA' ; сегмент данных
_DATA ENDS
_STACK SEGMENT PARA STACK 'STACK' ; сегмент стека
_STACK ENDS
;
DGROUP GROUP _DATA, STACK
;
ASSUME cs:_TEXT,ds:DGROUP,ss:DGROUP,es:DGROUP
;
_TEXT SEGMENT ; начало сегмента текста программы
; Локальная память данных (хранит эти описания в
- П-10 -
; сегменте текста программы)
DSdsave dw seg DGROUP ; память для DS-регистра
;
_TEXT ENDS
_DATA SEGMENT
PSPseg dw ? ; сегмент PSP
_DATA ENDS
_TEXT SEGMENT
;
main PROC NEAR ; начинайте процесс "main"
mov ds,DSsave ; инициализируйте память данных DS
mov ax,es ; получите адрес сегмента
mov word ptr PSPseg,ax ; PSP и сохраните его
;
;
; < Основная стандартная программа >
;
;
mov ax,4C00h ; завершите программу
int 21h
;
main ENDP
;
;- - - - - - - - - - - - - - - - - - - - - - - - - - -
;
; <Оставшаяся часть ваших стандартных программ>
;
;- - - - - - - - - - - - - - - - - - - - - - - - - - - -
_TEXT ENDS
_DATA SEGMENT
;
; < Bставьте данные >
;
_DATA ENDS
_TEXT SEGMENT
;------------------------------------------------------
_TEXT ENDS
END main
----------------------------------------------------------------
Листинг A-6. Шаблон .COM-программы
----------------------------------------------------------------
PAGE 60,132 ; широкая печать
;- - - - - - - - - - - - - - - - - - - - - - - - - - - -
FALSE EQU 0 ; сравнить с логическим значением
; FALSE ("ложь")
TRUE EQU 0FFFFH ; сравнить и проверить по маске
; логическоe значениe TRUE
; ("истина")
;
; <Установление равенств и макрокоманд>
;
;- - - - Инициализация - - - - - - - - - - - -
code SEGMENT
- П-11 -
ASSUME cs:code, ds:code, ss:code, es:code
;
main PROC NEAR
;
entry: ORG 0100h
;
mov sp,offset top_of_stack ; установите новый стек
;
;
; < Основная стандартная программа >
;
mov ax,4C00h ; завершите программу
int 21h
;
main ENDP
;
;- - - - - - - - - - - - - - - - - - - - - - - - - - -
;
; <Оставшаяся часть ваших стандартных программ>
;
;- - - - - - - - - - - - - - - - - - - - - - - - - - -
;- - - - - - - - - - - - - - - - - - - - - - - - - - -
;
; < Bставьте данные >
;
;- - - - - - - - - - - - - - - - - - - - - - - - - - -
;Дополнительный стек - BHИМAHИЕ - вы ДОЛЖНЫ(!)
;использовать функцию 4Сh для завершения данной
;программы, если вы используете локальный стек !
;
db 32 DUP ('stack ') ; 256-байтный стек
top_of_stack EQU $
;
;- - - - - - - - - - - - - - - - - - - - - - - - - - -
code ENDS ; конец сегмента текста программы
END entry
----------------------------------------------------------------
Листинг A-7. Полезные макрокоманды (STDMAC.INC):
----------------------------------------------------------------
; - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Файл включения макроопределений
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Стандартные равенства:
;
TRUE EQU 0FFFFh ; "истина"
FALSE EQU 0 ; "ложь"
;
; Cтандартные непечатаемые символы
NUL EQU 00000000b ; нуль
BEL EQU 00000111b ; "звонок"
BS EQU 00001000b ; возврат на символ с его стиранием
HT EQU 00001001b ; горизонтальная табуляция
LF EQU 00001010b ; перевод строки
- П-12 -
FF EQU 00001100b ; перевод страницы
CR EQU 00001101b ; возврат каретки
SUBST EQU 00011010b ; подстановка
ESCAPE EQU 00011011b ; переход
SPACE EQU 00100000b ; пробел
COLON EQU 00111010b ; двоеточие
SCOLON EQU 00111011b ; точка с запятой
;
; Pасширенные символы (фирмы "ИБМ"):
SLINE EQU 11000100b ; горизонтальная строка
;
;- - - - - - - - - - - - - - - - - - - - - - -
..XLIST ; запретить распечатку макроопределений
;;.LALL _ . ; распечатка всего
;;
;;
;;** @MODEL ********* Макроопределения общего назначения **
;; Установка сегментов согласно модели памяти.
;; Это макроопределение эмулирует управляющую команду
;; 5.Х.МОDEL макроассемблера MASM для использования с
;; более ранними версиями MASM.
IF1 ;; Ассемблирование только в процессе прохода 1
@Model MACRO memory_model,code_name,stack_size
;; ПРИМЕЧAHИЕ: "имя-программы" используется только
;; со средними, большими, а также с очень большими
;; моделями памяти
IFNB ;; модель памяти была указана?
;;
IF memory_model EQ 0
@TinyModel stack_size
ELSE
IF memory_model EQ 1
@SmallModel stack_size
ELSE
IF memory_model EQ 2
@MediumModel code_name,stack_size
ELSE
IF memory_model EQ 3
@CompactModel stack_size
ELSE
IF memory-model EQ 4
@ LargeModel code_name,stack_size
ELSE
IF memory_model EQ 5
@Large_Model code_name,stack_size
ELSE
.ERR
%0UT @Model macro: неизвестная модель памяти
ENDIF;; конец проверки очень большой модели
ENDIF;; конец проверки большой модели
ENDIF;; конец проверки компактной модели
ENDIF;; конец проверки средней модели
ENDIF;; конец проверки малой модели
ENDIF;; конец проверки очень малой модели
;;
ELSE ;; модель памяти не была указана
- П-13 -
.ERR ;; завершить сообщением об ошибке
%0UT @MODEL macro error: модель памяти не указана
ENDIF ;; конец проверки параметров модели - памяти
;;
ENDM ;; конец макроопределения
;;
ENDIF ;; конец обработки прохода
;;
;;** @Tiny ************ Макрокоманды общего назначения **
;; (Эта управляющая макрокоманда вызывается через @Model 0.
;; Эта управляющая макрокоманда также может вызываться
;; непосредственно).
;; Отметим, что эта макрокоманда, в отличие от других мак-
;; рокоманд памяти-модели, не использует макрокоманду
;; @Stack, поскольку другие стеки в .COM - программах дол-
;; жны быть описаны в конце данной программы. Для опреде-
;; ления других стеков в .COM-программах выполните макро-
;; команду @Stack в соответствующем месте исходного текста
;; программы.
IF1 ;; Ассемблировать только в процессе прохода 1
@TinyModel MACRO
MEMODEL = 0
_TEXT SEGMENT BYTE PUBLIC 'CODE' ; сегмент программы
_TEXT ENDS
;; Назначить физические сегменты
ASSUME cs:_TEXT,ds:_TEXT,ss:_TEXT, es:_TEXT
;;- - - - - - - - - - - - - - - - - - - - - - -
;; Вставьте вручную следующий текст программы после
;; @Model 0:
;;
;; _TEXT SEGMENT
;; main PROС near ;; entry: ORG 0100h ;; jmp Start ;; ;
вставьте данные здесь, если требуется ;; start: ;; ;
вставьте текст программы здесь ;; main ENDP ;; ; вставьте
стандартные программы здесь ;; ; вставьте дополнительный
стек здесь ;; ; вставьте данные в конце, если требуется
;; _TEXT ENDS ;;
;;- - - - - - - - - - - - - - - - - - - - - - - - - - -
ENDM ;; конец макроопределения
ENDIF ;; конец обработки прохода
;;** @Small ************ Mакрокоманды общего назначения **
;; Управляющая макрокоманда для установки Малой (SMALL)
;; модели памяти.
;; (Эта макрокоманда вызывается через "@Model Small".
;; Эта макрокоманда может быть вызвана также
;; непосредственно.)
IF1 ;; Ассемблирование только в процессе прохода 1
@SmallModel MACRO stack_size
MEMODEL = 1
_TEXT SEGMENT BYTE PUBLICK 'CODE' ; сегмент программы
_TEXT ENDS
_DATA SEGMENT WORD PUBLIC 'DATA' ; сегмент данных
; (DGROUP)
_DATA ENDS
CONST SEGMENT WORD PUBLIC 'CONST' ; сегмент констант
CONST ENDS ; (DGROUP)
_BSS SEGMENT WORD PUBLIC 'BSS' ; сегмент непроинициа-