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

81. Стековий кадр процедури

Процедура это определённая часть кода, которая вызывается командой call, при этом в стеке ей передаётся адрес следующей после call команды, что и позволяет командой ret перейти на эту метку. В досе каждая программа имела собственный сегмент, поэтому при вызове функций через прерывания параметры передавались в регистрах. Однако в Windows стек наследуем, то есть при вызове определённой функции она получает в своё распоряжение тот же стек, что и вызывающая его программа. Это даёт возможность передавать параметры через стек. И тут возникает вопрос как к ним обращаться, если единственная возможность обратиться к ним является обращением через esp. Но там где одна проблема там и другая, так как при адресации через определённый регистр мы должны сохранять его значение, в нашем случае не пользоваться стеком. Тогда самым простым решением является создание стекового кадра, что значит сохранить текущее значение стека в ebp (или любой другой регистр), предварительно сохранив его в тот же стек, и адресовать наши переменные уже через этот регистр. push ebp mov ebp,esp Теперь нам нужно получить доступ к переменным переданным процедуре, так как по адресу [ebp] у нас находится сохранённый ebp, а по адресу [ebp+04h] находится адрес возврата процедуры, то первым переданным нам параметром будет [ebp+08h], вторым - [ebp+0Ch] и т.д. Причём надо заметить, что параметр, загруженный в стек последним будет именно [ebp+08h]. Сохранение ebp является обязательным, так как если вызывающая процедура уже имеет стековой кадр, то изменяя его мы разрушаем стековой кадр вызывающей процедуры. Также обязательно восстановление ebp и esp, mov esp,ebp pop ebp

82. Написання модульних програм на Асемблері

  1. Створити новий проект

  2. Додати у проект головний файл програмного коду.

  3. Додати у проект модуль з ім’ям module.asm (можна використовувати будь-яке імя). У файл module.asm помістити текст процедури procedura і наданий нижче:

.586

.model flat, c.code

procedura

/текст процедури

procedura endp

end

Окрім файлу module.asm потрібно у робочу папку проекту записати файл заголовку модуля module.inc. У файлі заголовку вказуються директивою EXTERN імена процедур, які можуть викликатися іншими модулями. Поки що тільки одна така процедура у цьому модулі, тому файл module.inc містить один рядок:

EXTERN procedura : proc

  1. Як викликати процедуру procedura? Для цього спочатку потрібно у тексті головного файлу програми записати рядок

include module.inc

Тепер можна використовувати процедуру procedura. Щоб її правильно викликати, необхідно передати потрібні параметри.

83. Можливості використання мов високого рівня сумісно з Асемблером

Інколи постає необхідність використання асемблера при програмування на мовах високого рівня, часто при зверненні до апаратного забезпечення. Убагатьох мовах програмування високого рівня є зв'язок із асемблером. Наступний приклад демонструє додавання двох чисел на мові С з використанням вставки мови асемблера у середовищі Microsoft Visual C++[1]:

main ()

{

int a = 1; // оголошуємо змінну a і кладемо туди значення 1

int b = 2; // оголошуємо змінну b і кладемо туди значення 2

int c; // оголошуємо змінну c, але не ініціалізуємо її

// Початок асемблерної вставки

__asm{

mov eax, a // завантажуємо значення змінної a в регістр EAX

mov ebx, b // завантажуємо значення змінної b в регістр EBX

add eax, ebx // додаємо EAX з EBX, записуючи результат в EAX

mov c, eax // завантажуємо значення EAX у змінну c

}

// Кінець асемблерної вставки

// Виводимо вміст c на екран

// За допомогою звичної функції printf

printf ("a + b =% x +% x =% x \ n", a, b, c);

}

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