Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Способ 3, самый частый. Через стек

ИДЕЯ:

1. ПЕРЕД ВЫЗОВОМ
занести параметры в стек;

2. Вызвать процедуру;

3. Запомнить место в стеке через регистр BP (Base Pointer);

4. Внутри процедуры использовать параметры,
адресуясь ОТНОСИТЕЛЬНО BP;

5. Перед выходом восстановить
старое BP;

6. Выйти из процедуры

7. Очистить стек.

 

ОГРАНИЧЕНИЕ: Заносить в стек (PUSH) и читать из него (POP)

можно ТОЛЬКО МАШИННЫЕ СЛОВА (по 2 байта каждое).

 

ВОЗВРАТ ЗНАЧЕНИЙ ЧЕРЕЗ СТЕК

 

Это состояние стека сразу после возврата из процедуры. ГДЕ ТУТ МОЖЕТ БЫТЬ МЕСТО ДЛЯ ЧИСЛА, КОТОРОЕ ПРОЦЕДУРА ОСТАВИЛА В СТЕКЕ ДЛЯ ВЫЗЫВАЮЩЕЙ ПРОГРАММЫ?

 

 

ПРОЦЕДУРА обращается к этому полю как [BP + 8]

ВЫЗЫВАЮЩАЯ ПРОГРАММА обращается к этому полю по адресу SS:SP То есть может прочесть его POP reg / mem

 

ПОРЯДОК ЗАНЕСЕНИЯ ПАРАМЕТРОВ В СТЕК

Procedure AnyProc(x:integer; y:word; z: Pstring);

Begin … … … end;

Чем отличается А от Б?

X ßà [BP+4] или X ßà [BP+ 8 ]?

Компилятор должен ЗАРАНЕЕ знать порядок передачи параметров!

 

КТО ЧИСТИТ СТЕК?

Вариант 1й чистки стека. Это случай, когда стек чистит САМА ВЫЗВАННАЯ ПРОЦЕДУРА.

.model small .stack 100h .data ; пусто. Данные программе не нужны. .code eingang: ;mov ax, @data; здесь это ;mov ds, ax; даже не нужно... mov dl, 'f'; готовим параметр mov dh,0; для передачи ч-з стек SUB SP, 2; занять в стеке место ; под возвращаемое. push DX; занесли параметр в стек call UPCASE; 'F' <- 'f', результат в стеке pop DX; забираем из стека результат. mov ah, 2; символ уже в DL! int 21h; выводим его на экран mov ah,8 int 21h; Press any key... mov ah, 4ch int 21h ; см следующую колонку ;===Процедура - "функция" ======= UPCASE proc push BP; пролог mov BP, SP mov ax, [BP+4]; читаем параметр sub AL, ‘f'-'F'; преобр в верхн регистр mov [BP+6], AX; запись в стек ; возвращаемого pop BP; эпилог ret 2; выход и чистка стека ; от одного слова (2 байта) endp ;============================= end eingang  

 

Вариант чистки стека №2. стек чистит ВЫЗВАЮЩАЯ ПРОЦЕДУРА.

.model small .stack 100h .data ; пусто. Данные программе не нужны. .code eingang: ;mov ax, @data; здесь это ;mov ds, ax; даже не нужно... mov dl, 'f'; готовим параметр mov dh,0; для передачи ч-з стек SUB SP, 2; занять в стеке место ; под возвращаемое. push DX; занесли параметр в стек call UPCASE; 'F' <- 'f', результат в стеке ADD SP, 2; чистка стека от ; одного параметра (2 байта). pop DX; забираем из стека результат. mov ah, 2; символ уже в DL! int 21h; выводим его на экран mov ah,8 int 21h; Press any key... mov ah, 4ch int 21h ; см следующую колонку ;===Процедура - "функция" ======= UPCASE proc push BP; пролог mov BP, SP mov ax, [BP+4]; читаем параметр sub AL, ‘f'-'F'; преобр в верхн регистр mov [BP+6], AX; запись в стек ; возвращаемого pop BP; эпилог ret; выход endp ;============================= end eingang

 

ПАРАМЕТР «ЯЗЫК» ДЛЯ ВЫЗОВА ПРОЦЕДУР

.MODEL SMALL, «язык»

Значение параметра «ЯЗЫК» ПРОСМОТР СПИСКА ПАРАМЕТРОВ КТО ЧИСТИТ СТЕК
C (C++) ß СПРАВА НАЛЕВО Кто ВЫЗВАЛ
PASCAL СЛЕВА НАПРАВО à Процедура
STDCALL ß СПРАВА НАЛЕВО Процедура
SYSCALL ß СПРАВА НАЛЕВО Кто ВЫЗВАЛ

 

ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ В ПРОЦЕДУРАХ

Это место создается в прологе:

...

PUSH BP

MOV BP, SP

SUB SP, 4; по 2 байта на переменную,

; SP смещается с «1» на «2»

 

Но тогда ЭПИлог становится такой:

...

MOV SP, BP; SP смещается с «2» на «1»

POP BP

RET

 

<== предыдущая лекция | следующая лекция ==>
Способ 2. Через общий сегмент | Идея структуры
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 313; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.