Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programmirovanie_Lektsii_2015.doc
Скачиваний:
116
Добавлен:
22.03.2016
Размер:
1.19 Mб
Скачать

Inc si ; к следующей оценке

LOOP M2

Inc dx ; учет отличника

NEXT: MOV CX, AX

ADD BX, TYPE STUD ; на начало информации о следующем студенте

LOOP M1

Составление и оформление программ на ассемблере

Логические сегменты отражают разработку програм­мы в виде отличающихся друг от друга областей кода (соб­ственно программы), данных и стека.

Каждый логический (программный) сегмент должен начинаться с директивы 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).

Префикс программного сегмента. Com- и exe-программы

При загрузке программы в память операционная система создает префикс программного сегмента (Program Segment Prefix, PSP) размером 256 байт.

Различают прикладные программы с расширением .com и .exe.

Для инициализации exe-программ программист должен прописать некие стандартные действия, заключающиеся в следующем:

  1. Указать транслятору соответствие между логическими сегментами и сегментными регистрами.

  2. Сохранить в стеке адрес возврата в операционную систему. Этим адресом является адрес первых двух байт префикса программного сегмента, где находится команда перехода в ОС (для корректного возврата в стек необходимо записать DS:0)

  3. Необходимо загрузить в DS адрес сегмента данных.

push ds

mov ax,0

push ax

mov ax,Data

mov ds,ax

Первые три команды сохраняют в стеке адрес возврата в операционную систему после завершения выполнения программы, а две последние - осуществляют инициализацию сегментного регистра DS.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]