Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
assembler.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
159.56 Кб
Скачать

17. Передача аргументов через стек

Помещение параметров в стекПеред вызовом процедуры параметры необходимо поместить в стек с помощью команды PUSH. Здесь существует два варианта: параметры могут помещаться в стек в прямом или в обратном порядке. Обычно используется обратный порядок. Параметры помещаются в стек, начиная с последнего, так что перед вызовом процедуры на вершине стека оказывается первый параметр.Обращение к параметрам внутри процедурыДля обращения к параметрам внутри процедуры обычно используют регистр BP. В самом начале процедуры содержимое регистра BP сохраняется в стеке и в него копируется значение регистра SP. Это позволяет «запомнить» положение вершины стека и адресовать параметры относительно регистра BP.Извлечение параметров из стекаПосле того, как процедура выполнилась, необходимо очистить стек, вытолкнув из него параметры. Тут тоже существует 2 способа: стек может быть очищен самой процедурой или кодом, который эту процедуру вызывал. Для первого способа используется команда RET с одним операндом, который должен быть равен количеству байтов, выталкиваемых из стека. Для второго способа нужно использовать команду RET без операндов. Стек восстанавливается после выполнения процедуры путём прибавления значения к SP. С помощью такого способа программируются процедуры с переменным количеством параметров. Процедура не знает, сколько ей будет передано параметров, поэтому очистка стека должна выполняться вызывающим кодом. Совокупность таких особенностей, как способ и порядок передачи параметров, механизм очистки стека, сохранение определённых регистров в процедуре и некоторых других называется соглашениями вызова.

18. Возврат результата из процедуры.

В общем случае программист располагает тремя вариантами возврата значений из процедуры:

С использованием регистров. Ограничения здесь те же, что и при передаче данных, — это небольшое количество доступных регистров и их фиксированный размер. Данный способ является наиболее быстрым, поэтому его есть смысл использовать для организации критичных по времени вызова процедур.

С использованием общей области памяти. Этот способ удобен при возврате большого количества данных, но требует внимательности в определении областей данных и подробного документирования для устранения неоднозначностей.С использованием стека. Здесь, подобно передаче аргументов через стек, также нужно использовать регистр ebр. При этом возможны следующие варианты:- использование для возвращаемых аргументов тех же ячеек в стеке, которые применялись для передачи аргументов в процедуру. То есть предполагается замещение ставших ненужными входных аргументов выходными данными;- предварительное помещение в стек наряду с передаваемыми аргументами фиктивных аргументов с целью резервирования места для возвращаемого значения. При использовании этого варианта процедура, конечно же, не должна пытаться очистить стек командой ret. Эту операцию придется делать в вызывающей программе, например командой pop.

19. Связь ассемблера с языками высокого уровня

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

1.Использование ассемблерных вставок (встроенный ассемблер, режим inline). Ассемблерные коды в виде команд ассемблера вставляются в текст программы на языке высокого уровня. Компилятор языка распознает их как команды ассемблера и без изменений включает в формируемый им объектный код. Эта форма удобна, если надо вставить небольшой фрагмент.2.Использование внешних процедур и функций. Это более универсальная форма комбинирования. У нее есть ряд преимуществ:- написание и отладку программ можно производить независимо;- написанные подпрограммы можно использовать в других проектах;- облегчаются модификация и сопровождение подпрограмм.Встроенный ассемблерПри написании ассемблерных вставок используется следующий синтаксис:_asm КодОперации операнды ; // комментарии ///КодОперации задает команду ассемблера, ///операнды – это операнды команды. Если требуется в текст программы на языке Си вставить несколько идущих подряд команд ассемблера, то их объединяют в блок: _asm {

текст программы на ассемблере ; комментарии } Внутри блока текст программы пишется с использованием синтаксиса ассемблера. Использование внешних процедур Для связи посредством внешних процедур в общем случае возможны два варианта вызова: 1.программа на языке высокого уровня вызывает процедуру на языке ассемблера; 2.программа на языке ассемблера вызывает процедуру на языке высокого уровня.

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