Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по МО.doc
Скачиваний:
51
Добавлен:
01.06.2015
Размер:
354 Кб
Скачать
☆

2.8. Область действия имен

Если для аргументов и локальных переменных, а также меток операторов в подпрограмме, не заданы имена с предшествующим префиксом локального идентификатора, все аргументы, заданные в заголовке процедуры, определены ли они с помощью директивы arg или local и метки имеют глобальную область действия.

Идентификаторы с локальной областью действия разрешает ди­ректива locals (не путать с директивой local).

Например:

locals __ TST1 proc arg __A: word, __B: word, __C: byte local __X: word, __Y: dword...

В этом примере директива locals __ определяет двойной символ подчеркивания как префикс локальных имен. Это означает, что все имена, начинающиеся с данной пары символов, будут счи­таться локальными в пределах подпрограммы.

2.9. Итоги

Соединив все, что было сказано в предыдущих параграфах, можно предложить следующий шаблон подпрограммы:

locals __

... Func proc near arg __p1: word, __p2: word, ... = __ArgSize local __v1: byte, __v2: word, ... = __LocSize;Действие: ... ;Входные параметры: ... ;Выходные параметры: ... ;Возвращает: ... ;Обращение: ... ;Замечания: ; регистры не модифицирует ; стек чистит от параметров push BP ;+ BP - указатель mov BP, SP ;- кадра стека sub SP, __LocSize ;выделение памяти для лок. переменных push SI, DI ;сохранение регистров ... mov SI, __p1 ;доступ к параметру ... mov __v2, SI ;доступ к локальной переменной ... pop DI, SI ;восстановление регистров mov SP, BP ;чистка стека от лок. переменных pop BP ;восстановлениеBP ret __ArgSize ;возврат и чистка стека от параметров Func endp

3. Пример выполнения работы

Разработать подпрограмму, которая удаляет, начиная с задан­ной позиции строки, указанное число символов. Разработать про­грамму, которая вводит с клавиатуры строку, вводит позицию и длину удаляемой части строки и удаляет эту часть.

Текст программы:

locals __

model small

stack 100h

dataseg

MESS1 db 0dh,0ah,0dh,0ah,"Введите строку:",0dh,0ah,"$"

MESS2 db 0dh,0ah,"Введите позицию: $"

MESS3 db 0dh,0ah,"Введите число удаляемых символов: $"

MESS4 db 0dh,0ah,0dh,0ah,"Строка после удаления:",0dh,0ah,"$"

S_BUFLEN db 80 ; Макс. длина строки

S_FACTLEN db ? ; Длина фактически введенной строки

S_INPBUF db 80 dup (?) ; Введенная строка

N_BUFLEN db 3 ; Макс. длина числа при вводе

N_FACTLEN db ? ; Фактическая длина

N_INPBUF db 3 dup (?) ; Строка представления числа

POSDEL dw ? ; Позиция, начиная с которой удаляем

LENDEL dw ? ; Сколько символов удалить

codeseg

startupcode

; Ввод строки

MLOOP: lea DX, MESS1

mov AH, 09h

Int 21h ;Приглашение к вводу строки

lea DX, S_BUFLEN

mov AH, 0Ah

Int 21h ;Ввод строки

mov BL, S_FACTLEN

cmp BL, 0 ;Строка пустая?

jne LLL0 ;Нет - продолжать

jmp QUIT ;Закончить работу

LLL0: mov BH, 0 ;Дополнить длину до слова

add BX, 2 ; и получить адрес позиции

add BX, DX ; сразу после конца строки

mov byte ptr[BX],0;Записать признак конца строки

; Ввод позиции удаления

LLL1: lea DX, MESS2 ;Приглашение

mov AH, 09h ; к вводу