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

84. Конвенції виклику процедур

Соглашение о вызове (англ. Calling convention)  — часть двоичного интерфейса приложений, которая регламентирует технические особенности вызова подпрограммы, передачи параметров, возврата из подпрограммы и передачи результата вычислений в точку вызова.

Соглашение вызова определяет следующие особенности процесса использования подпрограмм:

  • Расположение входных параметров подпрограммы и возвращаемых ею значений. Наиболее распространённые варианты:

    • в регистрах;

    • в стеке;

    • в регистрах и стеке.

  • Порядок передачи параметров. При использовании для параметров стека определяет, в каком порядке параметры должны быть помещены в стек, при использовании регистров — порядок сопоставления параметров и регистров. Варианты:

  • Кто возвращает указатель стека на исходную позицию:

    • вызываемая подпрограмма — это сокращает объём команд, необходимых для вызова подпрограммы, поскольку команды восстановления указателя стека записываются только один раз, в конце подпрограммы;

    • вызывающая программа — в этом случае вызов становится сложнее, но облегчается использование подпрограмм с переменным количеством и типом параметров.

  • Какой командой вызывать подпрограмму и какой — возвращаться в основную программу.

  • Содержимое каких регистров процессора подпрограмма обязана восстановить перед возвратом.

Соглашения вызова зависят от архитектуры целевой машины и компилятора.

Джерело: http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%B3%D0%BB%D0%B0%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE_%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%B5

85. Конвенція cdecl. Приклад програмування.

Cdecl- тип викликів, який походить з мови програмування C і використовується за замовчуванням в компіляторах С/С++ на архітектурі x86[1]. Параметри в підпрограму передаються через стек, куди поміщаються у зворотному порядку (справа наліво). 32-бітний результат повертається в регістрі процесора EAX. Чисткою стека займається зовнішня підпрограма.

Приклад.

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

1. файл c_asm.cpp (bc)

#include <iostream.h>

int p1,p2;

int extern cdecl addint (int,int);

void main()

{

cout<<"\n p1=";

cin>>p1;

cout<<"\n p2=";

cin>>p2;

cout<<"\n сумма="<<addint(p1,p2);

}

файл c_asm.c (tc++)

# include <stdio.h>

int p1,p2;

int extern cdecl addint(int,int);

void main()

{

printf("\n Введите значение p1 : ");

scanf("%d",&p1);

printf("\n Введите значение p2 : ");

scanf("%d",&p2);

printf("\n Результат Y= ");

printf("%d",addint(p1,p2));

}

2. функция addint (asm_c.asm)

.MODEL SMALL

.CODE

PUBLIC _addint ; добавляется _

_addint proc far ; добавляется _

; используется атрибут процедуры far, если в С

; задана модель памяти LARGE

push bp

mov bp,sp

mov ax,[bp+6]

add ax,[bp+8]

pop bp

ret

_addint endp

end

Джерело:

http://uk.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B3%D0%BE%D0%B4%D0%B6%D0%B5%D0%BD%D0%BD%D1%8F_%D0%B2%D0%B8%D0%BA%D0%BB%D0%B8%D0%BA%D1%96%D0%B2

http://webcache.googleusercontent.com/search?q=cache:_L5DprTiGGwJ:phys.onu.edu.ua/files/student/3course/1term/assembler/lab_14.doc+&cd=5&hl=ru&ct=clnk&gl=ua

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