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.
|