Язык ассемблера микропроцессора 8088. Константы с фиксированной запятой. Определение данных и распределение памяти, страница 6




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        Ассемблер воспринимает