Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kratkie_otvety_ekzamen_CP_2011-12.docx
Скачиваний:
19
Добавлен:
14.04.2019
Размер:
132.13 Кб
Скачать

49. Создание встраиваемого ассемблерного кода. Ассемблер, встроенный в программу на языке с.

- Конвенция С

Этот способ передачи параметров используется в первую очередь в языках С и C++. Параметры помещаются в стек в обратном порядке, и, в противоположность PASCAL-конвенции, удаление параметров из стека выполняет вызывающая процедура. Запись

some_proc(a,b,c,d,e)

превращается в

push e

push d

push с

push b

push a

call some_proc

add sp,10 ; освободить стек

Вызванная таким образом процедура может инициализироваться так: some_proc proc push bp mov bp,sp ; создать стековый кадр a equ [bp+4] ; определения для простого доступа к параметрам b equ [bp+6] с equ [bp+8] d equ [bp+10] e equ [bp+12] ; текст процедуры, использующей параметры a, b, с, d, e pop bp ret some_proc endp

Ассемблеры поддерживают и такой формат вызова при помощи усложненной формы директивы proc с указанием языка С:

some_proc proc С,а:word,b:word,с:word,d:word,e:word

; текст процедуры, использующей параметры a, b, с, d, e.

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

; его использовать нельзя!

ret

some_proc endp

Мы не пользовались до сих пор этими формами записи процедур в ассемблере потому, что они скрывают от нас тот факт, что регистр ВР используется для хранения параметров и его ни в коем случае нельзя изменять, и, в случае PASCAL, что команда ret на самом деле — команда ret N.

- Встроенный ассемблер в С

Код на С.

_asm {

Код на ассемблере.

};

Код на С.

Для использования меток перед меткой нужно ставить знак @.

50. Охарактеризуйте системные средства управления памятью. Опишите структуру и образ памяти программ .Exe и .Com.

Все программы, запускаемые на выполнение в операционной системе DOS, загружаются в память с помощью функции Exec (Int 21h, функция 4Bh). Кроме загрузки программы, эта функция формирует PSP (префикс программного сегмента) загружаемой программы, создает копию окружения, а также настраивает регистры. Эту функцию может вызывать как COMMAND.COM, так и любой другой запущенный процесс, в том числе и поль­зовательский.

При запуске программы в DOS, ей отводится вся свободная память. Для того чтобы загрузить дочерний процесс, родительская программа должна оп­ределить объём памяти необходимый ей для выполнения, освободить неис­пользуемую память, уменьшив выделенную ей память до необходимого раз­мера. Операции с памятью реализуются функциями 48h (выделить блок па­мяти), 49h (освободить выделенную память) и 4Ah (изменить размер уже вы­деленного блока).

Размеры .СОМ и .ЕХЕ программ вычисляются различным образом. Для определения размера .ЕХЕ программы, состоящей из трех сегментов -сегмента кода, данных и стека, следует включить в программу пустой фик­тивный сегмент, расположив его после всех остальных сегментов. Этому сегменту необходимо присвоить произвольный класс, гак как сегменты одно­го класса располагаются в памяти друг за другом. Сегменты без имени класса принадлежат к безымянному классу. Возможна ситуация, когда фиктивный сегмент без класса будет загружен сразу после другою сегмента без класса, а не в самом конце программы, как требуется. Учитывая, что при загрузке в регистре es находится адрес начала программы (адрес PSP), размер програм­мы типа ЕХЕ можно определить следующим образом:

EXEC загружает в память программу типа .СОМ, начиная с адреса PSP:0100h, и передает; ей управление. При загрузке программы типа .ЕХЕ, в которой есть команды вызова дальних процедур (сегментов данных), DOS изменяет эти команды так, чтобы используемые в них сегментные адреса соответствовали сегментным адресам, по которым загружены в память указанные процедуры (сегменты данных).

После загрузки программы типа .СОМ содержимое регистров следующее:

  • в AL будет код OFFh, если первый аргумент командной строки содер­жит ошибочное имя диска, иначе - 00h;

  • в АН будет код OFFh, если второй аргумент командной строки со­держит ошибочное имя диска, иначе - 00h;

  • в регистры CS, DS, ES, SS загружается сегментный адрес PSP;

  • в IP записывается 100Н, смещение точки входа в программу;

  • в SP - адрес последнего слова в сегменте (обычно OFFFEh; меньше, если не хватает памяти). Пользователь может выделить буфер под стек и, ес­тественно, установить другое значение SP.

При запуске программы типа .ЕХЕ регистры ES, DS загружаются сегментным адресом PSP, CS - сегментным адресом кода программы, SS - сегментным адресом сте­ка, а SP - адресом вершины стека, на IP записывается смещение точки входа в программу.

Затем в стек помещается слово OOOOh и управление передаётся на стар­товую точку программы (для программы типа СОМ - PSP:0100h; для про­граммы типа .ЕХЕ - указанная в директиве END точка входа).

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