.: [предыдущая | оглавление | следующая] :.

3.1 Передача параметров

Механизм передачи параметров в Си основан на использовании системного стека. Необходимо напомнить, что в процессоре есть специальный регистр, называемый регистром стека SP (stack pointer) и две специальных команды, push - положить слово в стек, и pull - взять слово из стека.

Рассмотрим пример передачи параметров. Пусть задана следующая функция:

int Add(int a, int b)
{
      return a+b;
}
и где-то в программе есть следующий код:
... x=Add(i,j) ....
Тогда ассемблерный код будет следующий:
_Add mov bp,sp ; взять адрес вершины стека и поместить в индексный регистр
Mov r1,[bp+4] ;взять значение первого параметра
mov r2,[bp+6] ;взять значение второго параметра
add r1,r2 ;сложить
Return ;вернуть управление и значение
....
push j ;положить в стек значение последнего параметра в списке
push i ;положить в стек значение первого параметра
call _Add ; вызвать функцию _Add
mov x,r1 ; присвоить значение суммы ячейке x
pull r1 ; восстанавливаем стек
pull r2

Важно помнить, что в Си вычисление значений параметров и их помещение в системный стек производится с конца списка, а для функций и процедур, написанных на паскале, производится с начала списка. Например:

#include <stdio.h>
int TYPE Test(int a, int b)
{
      printf("%d %d\n",a,b);
      asm { bbb };
      return 1;
}
int main()
{
      int i=10;
      Test(i++, i++);
      return 0;
}

Если слово TYPE заменить на cdecl, то параметры будут передаваться по правилам Си и после выполнения программы на экран будет выдано 11 10. Если слово TYPE заменить на pascal, то программа выдаст экран 10 11.

.: [предыдущая | оглавление | следующая] :.