Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АССЕМБЛЕР И ПРОГРАММИРОВАНИЕ ДЛЯ IBM PC.doc
Скачиваний:
48
Добавлен:
25.05.2014
Размер:
3.21 Mб
Скачать

00 Указатель блока вызывающей программы

02 Указатель сегмента возврата

04 Указатель смещения возврата

06 Адрес второго параметра

08 Адрес первого параметра

Так как ассемблерная подпрограмма будет использовать регистр BP, то

его необходимо сохранить в стеке для последующего восстановления при

возврате в вызывающую PASCAL-программу. Заметьте, что этот шаг в

вызываемой подпрограмме аналогичен предыдущему примеру на рис.21.6.

Регистр SP обычно адресует элементы стека. Но так как этот регистр

нельзя использовать в качестве индексного регистра, то после сохранения

старого значения регистра BP необходимо переслать адрес из регистра SP в

BP. Этот шаг дает возможность использовать регистр BP в качестве

индексного регистра для доступа к элементам в стеке.

Следующий шаг - получить доступ к адресам двух параметров в стеке.

Первый переданный параметр (адрес строки) находится в стеке по смещению

08, и может быть адресован по BP+08. Второй переданный параметр (адрес

столбца) находится в стеке по смещению 06 и может быть адресован по BP+06.

Два адреса из стека должны быть переданы в один из индексных

регистров BX, DI или SI. В данном примере адрес строки пересылается из

[BP+08] в регистр SI, а затем содержимое из [SI] (значение строки)

пересылается в регистр DH.

Значение столбца пересылается аналогичным способом в регистр DL.

Затем подпрограмма использует значения строки и столбца в регистре DX при

вызове BIOS для установки курсора. При выходе подпрограмма восстанавливает

регистр BP. Команда RET имеет операнд, значение которого в два раза больше

числа параметров, в данном случае 2х2, или 4. Параметры автоматически

выводятся из стека и управление переходит в вызывающую программу.

Если в подпрограмме предстоит изменить сегментный регистр то

необходимо сохранить его значение командой PUSH на входе и восстановить

командой POP на выходе. Можно также использовать стек для передачи величин

из подпрограммы в вызывающую программу. Хотя рассмотренная подпрограмма не

возвращает каких-либо значений, в языке PASCAL предполагается, что

подпрограмма возвращает одно слово в регистре AX или двойное слово в

регистровой паре DX:AX.

В результате компановки двух программ будет построена карта

компановки, в которой первый элемент PASCALL представляет

PASCALL-программу, второй элемент CODESEG (имя сегмента кода) представляет

ассемблерную подпрограмму. Далее следует несколько подпрограмм для

PASCALL-программы. Эта довольно тривиальная программа занимает в

результате шест.5720 байт памяти - более 20К. Компилирующие языки обычно

генерируют объектные коды значительно превышающие по объему размеры

компилируемой программы.

КОМПОНОВКА ПРОГРАММ НА ЯЗЫКЕ CИ И АССЕМБЛЕРЕ

________________________________________________________________

Трудность описания связи программ на языке C и ассемблерных программ

состоит в том, что различные версии языка C имеют разные соглашения о

связях и для более точной информации следует пользоваться руководством по

имеющейся версии языка C. Здесь приведем лишь некоторые соображения,

представляющие интерес:

- Большинство версий языка C обеспечивают передачу параметров

через стек в обратной (по сравнению с другими языками)

последовательности. Обычно доступ, например, к двум параметрам,

передаваемым через стек, осуществляется следующим образом:

MOV ES,BP

MOV BP,SP

MOV DH,[BP+4]

MOV DL,[BP+6]

...

POP BP

RET

- Некоторые версии языка C различают прописные и строчные буквы,

поэтому имя ассемблерного модуля должно быть представлено в том же

символьном регистре, какой используют для ссылки C-программы.

- В некоторых версиях языка C требуется, чтобы ассемблерные

программы, изменяющие регистры DI и SI, записывали их содержимое в

стек при входе и восстанавливали эти значения из стека при выходе.

- Ассемблерные программы должны возвращать значения, если это

необходимо, в регистре AX (одно слово) или в регистровой паре DX:AX

(два слова).

- Для некоторых версий языка C, если ассемблерная программа

устанавливает флаг DF, то она должна сбросить его командой CLD перед

возвратом.

ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ

________________________________________________________________

- В основной программе, вызывающей подпрограмму, необходимо

определять точку вход