Составление и оформление программ на ассемблере
Логические сегменты отражают разработку программы в виде отличающихся друг от друга областей кода (собственно программы), данных и стека.
Каждый логический (программный) сегмент должен начинаться с директивы SEGMENT (сегмент) и заканчиваться директивой ENDS (конец сегмента):
<имя> SEGMENT [<список атрибутов>]
……
<имя> ENDS
Логические сегменты как средство языка ассемблера взаимосвязаны с физическими сегментами, представляющими собой особенности архитектуры микропроцессора.
Каждый логический сегмент в ассемблерной программе определяет наименованную область памяти, которая адресуется с неизменным содержимым одного из сегментных регистров.
Пример:
DATA SEGMENT
key db ?
ind dw 10
addr dd ?
poly dw 1
DATA ENDS
Необходимая ассемблеру информация о содержимом сегментных регистров сообщается в директиве ASSUME, имеющей следующий формат:
ASSUME <SR: базовое значение>, [<SR: базовое значение>]...
Поле SR содержит имя одного из сегментных регистров (CS, DS, SS, ES), а базовое значение указывает начало области памяти, адресуемой через сегментный регистр.
Одним из наиболее часто используемых типов базового значения является имя сегмента, например:
ASSUME DS: DATA
До использования сегментного регистра в формировании физических адресов памяти он должен быть инициализирован. База, соответствующая логическому сегменту, представлена именем сегмента. Следовательно, при инициализации сегментного регистра DS, определяющего основную область данных, используется имя основного сегмента данных, например:
сегмент DATA является в программе основной областью данных, тогда до любых обращений к переменным необходимо инициализировать сегментный регистр DS:
mov ax,DATA ; инициализация регистра ds
mov ds,ax ; через регистр ax
Пример объявления стекового сегмента:
sSTACK SEGMENT stack
db 100 dup(?)
sSTACK ENDS
Вызов процедуры (переход с возвратом):
CALL <имя процедуры>
Возврат из процедуры (return):
RET
Для организации процедур в языке ассемблера предназначены директивы PROC и ENDP. Директива PROC отмечает точку входа процедуры, а директива ENDP - окончание процедуры. Формат этих директив имеет следующий вид:
<имя> PROC <тип>
тело процедуры
<имя> ENDP
Справа от ключевого слова PROC указывается тип процедуры NEAR или FAR (по умолчанию принимается тип NEAR).
Дата добавления: 2015-10-09; просмотров: 498;