TINY, SMALL, MEDIUM, COMPACT, LARGE, HUGE, TCHIGE, TPASCAL, FLAT
Директивы упрощенного описания сегментов употребляются в программе после выбора модели памяти директивой .MODEL.
В тексте программного модуля директивы упрощенного описания могут располагаться в произвольном порядке: Turbo Assembler компонует все части с одинаковыми именами в один сегмент.
Директива
| Описание
| .CODE[имя]
| Начало или продолжение кодового сегмента модуля.Для модели с типом FAR можно задать имя ,которое становится действующим именем сегментa. B этом случае нельзя иметь более одного кодового сегмента в модуле.
| .DATA
| Начало или продолжение сегмента данных, инициалиированных по умолчанию.
| .CONST
| Начало или продолжение сегмента постоянных данных модуля..
| .DATA?
| Начало или продолжение сегмента данных, неинициированных по умолчанию.
| .STACK[размер]
| Начало или продолжение сегмента стека программного модуля. Необязательный параметр размер указывает объем памяти, отводимой под стек. По умолчанию Turbo Assembler устанавливает размер стека 1К.
|
Использование директив упрощенного описания сегментов создает переменные, которые описывают детали выбранного сегмента. К значениям этих переменных можно обращаться для получения информации о том или ином сегменте. В следующей таблице приведено описание этих идентификаторов:
Идентификатор
| Значение
| @code
| Сегмент или группа ,назначенные CS.
| @data
| То же DS.
| @stack
| Сегмент или группа ,назначенные SS.
| ;----------------------------------------------------------------------------------------------------
;get_str1.asm Главная программа для вызова функции gets1.asm. Вызов ;функции:
; int gets1(char *buf);
; Здесь *buf- адрес буфера. Функция возвращает число прочитанных байт.
;----------------------------------------------------------------------------------------------------
LBUF=82
EXTRN gets1:near
.MODEL small
.DATA
string db LBUF dup(?) ;Буффер для приема строки
.STACK 100h
.CODE
beg proc far
push ds
sub ax,ax
push ax
mov ax,@data ; В ax адрес сегмента данных
mov ds,ax
mov ax,offset string ; Передача адреса string через стек
push ax
call gets1
add sp,2 ; Очистка кадра стека
ret
beg ENDP
END beg
Рис. 1.12. Головная программа для вызова модуля gets1.asm
В программе на рис. 1.12 используется передача параметра через стек.
;----------------------------------------------------------------------------------------------------
;gets1.asm
; Функция чтения строки. Прототип:
; int gets(char* p_str);
; По адресу p_str помещается строка в ASCIIZ. Функция возвращает число ;прочитаных символов.
;----------------------------------------------------------------------------------------------------
L_VAL=134
.MODEL small
.CODE
PUBLIC gets1
gets1 PROC near
ARG p_str:word ;адрес строки вызывающего модуля
LOCAL string:byte:L_VAL,p_ds:word=L_PER
;string:byte:L_VAL буфер для приема строки, используемый при вызове функции ;0ah прерывания int 21h
push bp
mov bp,sp
sub sp,L_PER ;резервирование места для локальных переменных
mov ax,bp
sub ax,L_VAL
push ds
push dx
mov p_ds,ds
mov dx,ax ;установка регистров ds:dx на начало буфера
mov ax,ss
mov ds,ax
mov string,L_VAL ;в первый байт записывается максимальная длина ;буфера
mov ah,0ah
int 21h
push si
push di
mov si,dx ;загрузка регистра si
add si,2 ;регистры ds:si используются при вызове lodsb
mov ax,p_ds ;загрузка регистров es:di, которые используются при
mov es,ax ;вызове функции stosb
mov di,p_str
a: lodsb
cmp al,0dh ;прверка на конец строки
jz b
stosb
jmp a
b: xor al,al
stosb ;запись нуль-терминатора
xor ah,ah
mov al,string+1 ;в ax - числи считанных байтов
pop di
pop si
pop dx
pop ds
mov sp,bp
pop bp
ret
gets1 endp
end
Рис. 1.13. Вызываемый модуль gets1.asm.
В приведенной на рис. 1.13 программе для ввода строки из клавиатуры используется функция 0ah лрерывания int 21h. Эта функция помещает вводимую строку в буфер, место для которого выделено в стеке. Затем эта строка передается в вызывающую программу в формате ASCIIZ.
;----------------------------------------------------------------------------------------------------
;get_str2.asm Главная программа для вызова функции gets2.asm. Вызов ;функции:
; int gets2(char *buf);
; Здесь *buf- адрес буфера. Функция возвращает число прочитанных байт.
; В этом примере в директиве .MODEL указан язык Си, поэтому в модуле будут ;выполняться соглашения языка Си по умолчанию.
;----------------------------------------------------------------------------------------------------
LBUF=82
EXTRN _gets:near
.MODEL small,C
.DATA
string db LBUF dup(?)
.STACK 100h
.CODE
beg proc far
push ds
sub ax,ax
push ax
mov ax,@data
mov ds,ax
mov ax,offset string
push ax
call _gets
add sp,2
ret
beg ENDP
END beg
Рис. 1.14. Вызывающая программа, поддерживающая соглашения языка Си по умолчанию.
Следует обратить внимание на то, что имя вызываемого модуля _gets содержит символ подчеркивания, что согласуется с соглашениями, принятыми для языка Си.
Описание модуля можно упростить, если воспользоваться директивами .STARTUP и .EXIT. Директива .STARTUP инициализирует регистры DS, SS и SP. Идентификатор @Startup автоматически помещается перед начальным кодом, генерируемым директивой STARTUP, и представляет собой метку ближнего типа, указывающую на начало программы. Для автоматического создания в программе кода завершения предназначена директива .EXIT. Синтаксис этой директивы следующий:
.EXIT [код_возврата]
Необязательный параметр код_возврата - выражение, результат вычисления которого возвращается операционной системе по завершения работы программы. Пример применения этих директив приведен на рис. 1.15.
LBUF=82
EXTRN _gets:near
.MODEL small,C
.DATA
string db LBUF dup(?)
.STACK 100h
.CODE
beg proc far
.STARTUP
mov ax,offset string
push ax
call _gets
add sp,2
.EXIT
beg ENDP
END beg
Рис.1.15.
|