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

Интерфейс с Си

extern caps();

main ()

{

char c;

for(c=’a’; c<=’z’; c++) caps(c);

c = caps (‘z’+1);

caps (c);

caps (‘\n’+32);

}

func segment

public caps

caps proc near

push bp

mov bp,sp

mov DL,[BP]+4 ;взять аргумент

sub DL,32 ;перевести в заглавные

push AX

mov AH,2

int 21h

pop AX

pop BP

ret 2

caps endp

func ends

end

Программы с несколькими сегментами команд.

Рассмотрим программы с расширением ЕХЕ. Любая программа, загружаемая в память, включает три компонента:

  • окружение ENVIRONMENT

  • префикс программы PSP

  • собственно программу, в случае ЕХЕ может состоять из нескольких сегментов.

Поскольку окружение и сама прграмма ( включая РSР) рассматриваются DOS ,как отдельные блоки памяти, и та, и другая структура предворяются блоками управления памяти. МСВ-, размером 16 байт. С помощью этих блоков DOS ведёт учёт свободной и занятой памяти.

DS:[2ch], ES:[2Ch]

MCB

Окружение

DS,ES

MCB

CS

PSP

программа

CS,SS,IP и SP инициализируются заголовками из ЕХЕ-файла.

Рассмотрим … .СОМ программы. В этом случае единственный сегмент содержит все компоненты программы.

-PSP

-коды команд

-данные

-стек

В терминах языков высокого уровня это соответствует минимальной или крошечной модели памяти. Преимущество .СОМ прогр. перед ЕХЕ- компакность. Как правило резидентная программа пишется в формате .СОМ.

IP = 0100h

PSP

Программа с данными

SP = 0FFFEh

стек

Формат MCB блока

смещение

длина

Содержимое

0

1

Тип ‘M’ (2DH) – за этим блоком есть еще блоки MCB

Тип ‘Z’ (5AH) – данный блок последний

1

2

Владелец (сегм. Адрес)

3

2

Размер (число параграфов в памяти)

5

11

Зарезервировано

Если команда помещается в один сегмент команд и данные в одном сегменте данных, то такая .ЕХЕ программа принадлежит к малой модели памяти. Если требуется увеличить объём команд, то необходимо организовать несколько сегментов команд. Программа с несколькими сегментами команд и одним сегментом данных относится к средней модели памяти. В программе, содержащей несколько сегментов команд, должны быть команды либо перехода из одного сегмента в другой, либо вызов процедуры из другого сегмента. Любое обращение к другому сегменту команд носит название межсегментного или дальнего.

Рассмотрим пример программы с двумя сегментами команд. Пусть основная программа в одном сегменте, а процедура-подпрограмма в другом .

text1 segment ‘code’

assume CS:text1, DS:data

main proc

mov AX,data

mov DS,AX

.

.

call far ptr subr1

.

.

call far ptr subr2

.

.

main endp

text ends

text2 segment ‘code’

assume CS:text2, DS:data

subr1 proc far

.

.

subr1 endp

;

subr2 proc far

.

.

subr2 endp

text2 ends

;

data segment

… DB

…DW

.

.

data ends

stack segment stack ‘stack’

DW 128 dup(0)

stack ends

end main

Сегмент команд с главной процедурой получил название text1. Процедуры subr1 и subr2 объявлены с описанием far, а её вызовы в главной процедуре сопровождаются описаниями far ptr (far pointer- дальний указатель). Вызов не call, а call far ptr.

Смещение код команды адрес проц. subr1

000A 9A 0009 4451 call far ptr subr1

1 )CS=444D->в стек

2)IP=000F->в стек

код операции дальнего 3)4451-> в CS

вызова 4)0009-> в IP

ret- работает в зависимости от того, как объявлена процедура

ret-в дальней проц. снимает со стека два слова.

ret-в ближней процедуре снимает со стека одно слово.

Т.о. ближние процедуры следует вызывать только из того же сегмента командой ближнего вызова call, в то время, как процедуры, объявленные, как дальние следует вызывать только с помощью команды дальнего вызова call far ptr. Лишь в этом случае завершающие эти процедуры команды ret будут работать правильно.

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