MAIN SEGMENT
ASSUME CS :MAIN,DS : NOTHING, ES : NOTHING,
SS: NOTHING
;Процедура CONVERSION включает в себя три другие процедуры
;CONASC1, CONASC2, и CONVERT, выполняющие преобразование
;шестнадцатеричного числа в код ASCII
;Все эти процедуры определены в сегменте MAIN
CONVERSION PROC NEAR
;
;Первая процедура — CONASC1
CONASC1 PROC NEAR
MOV AH, AL преобразовать содержимое AL в 2 байта кода ASCII CALL CONVERT XCHG AL,AH MOV CL,4 SHR AL,CL CALL CONVERT RET CONASC1 ENDP
;Вторая процедура — CONVERT CONVERT PROC NEAR
AND AL,0FH
CMP AL,9
JBE NEXT
ADD AL,7 NEXT: ADD AL,0B0H
RET CONVERT ENDP
•Третья процедура — CONASC2
CONASC2 PROC NEAR преобразование содержимого
AX в 4 байта кода ASCII.
MOV DX,AX
CALL CONASC1
XCHG AX,DX
XCHG AH,AL
CALL CONASC1
RET
CONASC2 ENDP CONVERSION ENDP MAIN ENDS
Рис. 3.11. Внутрисегментные процедуры. 119
вызывается командами CALL. Блок данных, имеющий важное значение для прикладной программы, также следует разбить на процедуры с именами, отражающими их сущность таким образом, чтобы программа была более простой и понятной.
Макроассемблерные директивы PROG (Procedures — процедуры) ENDP (End Procedures - конец процедур) предназначены для указания начала и окончания процедуры. Вместе с директивой PROC могут быть заданы параметры FAR и NEAR, которые позволяют ассемблеру следить за тем, является ли процедура внутрисегментной или межсегментной (рис. 3.11).
Открытая процедура или открытый сегмент
Для каждой директивы PROC (Procedure Definition) должна быть записана соответствующая директива ENDP (End Procedure). Если директива ENDP пропущена или имя процедуры в записи ENDP записано неверно, макроассемблер генерирует предупреждающее сообщение, что процедура не закрыта надлежащим образом. Точно также директива ENDS (End Segment) должна быть задана для каждой директивы SEGMENT (Segment Definition). Если утверждение ENDS пропущено или имя сегмента в нем указано неверно, генерируется предупреждающее сообщение, что сегмент открыт. Наиболее вероятной причиной ошибки является неверная запись имени сегмента или процедуры.
SAMPLE PROC1
PROC PROC2
SEGMENT PROG AND RET
ENDP PROC
OR
NEAR AL,00
NEAR AL.0FFH
Неверные записи а) Нет соответствующей директивы ENDP для процедуры PROC1 (Имя PROC1 в записи ENDP указано невер но)
б) Нет соответствующей директивы ENDS
120
RET
PROC2 ENDP END
Данный вариант является правильной записью предыдущего примера:
SAMPLE SEGMENT PROC1 PROG NEAR
AND AL,00
RET
PROC1 ENDP SAMPLE SEGMENT PROC2 PROG NEAR
AL,0FFH
OR
RET
PROC2 ENDP SAMPLE ENDS
END
Неопределенные символические имена
Неопределенные символические имена представляют собой тип ошибок, которые наиболее часто встречаются при программировании. Ассемблер генерирует сообщение о такой ошибке, если имя не определено в поле метки какого-нибудь утверждения ассемблерной программы. Если имя не является локальным (оно определено в другой программе), то его следует определить как внешнее имя директивой EXTRN (External — внешний). Неправильная запись имени является наиболее вероятной причиной такой ошибки, особенно в тех случаях, когда используемые шестнадцатеричные константы записываются без начальной цифры.
SECOND
PROG NEAR MOV AX,CS MOV DS,AX
Неверные записи а) Неопределенное имя VALUE
MOV ES,AX
MOV AX, VALUE б) Некорректная шестнадцатеричная запись
MOV BX,FFF2H Ассемблер воспринимает
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.