-
Notifications
You must be signed in to change notification settings - Fork 2
Лабораторная работа 8
Inspirate789 edited this page Apr 20, 2022
·
2 revisions
Соглашение о вызове — формализация правил вызова подпрограмм, которое должно включать:
- способ передачи параметров;
- способ возврата результата из функции;
- способ возврата управления. Соглашения о вызовах определяются в рамках отдельных языков высокого уровня, а также - различных программных API, в т. ч. API операционных систем.
cdecl32
— соглашение о вызовах, используемое компиляторами для языка Си на 32-разрядных системах.
- Аргументы функций передаются через стек, справа налево.
- Аргументы, размер которых меньше 4-х байт, расширяются до 4-х байт.
- Очистку стека производит вызывающая программа.
- Возврат параметров 1, 2, 4 байта (целые числа, указатели) - через eax.
- Возврат больших структур, массивов, строк - указателем через eax.
Перед вызовом функции вставляется код, выполняющий следующие действия:
- сохранение значений регистров, используемых внутри функции;
- запись в стек аргументов функции. После вызова функции вставляется код, выполняющий следующие действия:
- очистка стека;
- восстановление значений регистров. В 64-разрядных системах могут применяться другие соглашения.
Составной оператор языка высокого уровня, телом которого является код на языке ассемблера.
#include <iostream>
int main()
{
int i;
__asm {
mov eax, 5;
mov i, eax;
}
std::cout << i;
return 0;
}
// main.cpp
#include <iostream>
extern "C"
{
void testAsm(); // подключение в код на Си/Си++ функции
// на другом языке программирования,
// выполненной в соответствии с соглашениями
// о вызовах Си
}
int main()
{
int i;
__asm {
mov eax, 5;
mov i, eax;
}
std::cout << i;
testAsm();
__asm {
mov i, eax;
}
std::cout << i;
return 0;
}
; test.asm
.686
.MODEL FLAT, C
.STACK
.CODE
testAsm PROC
mov eax, 7
ret
testAsm ENDP
END
Такая программа выведет в консоль символы 57: первая цифра задана в ассемблерной вставке, вторая - в отдельном файле.