Кадр стека несколько отличается.
абонент не не настроил %ebp
. Это до функции , называемой , , если она вообще решит использовать %ebp
.
Обратите внимание, что в вашей функции ниже не использовать %ebp
вообще. Все ссылки на аргументы относятся к указателю стека (%esp
).
Это дает кадр стека:
1000: nbElements
0FFE: in
0FFC: out
0FFA: return address
0FF6: <---------------------- %esp points here
Итак, как показано ниже для доступа к nbElements
, вы хотите 12(%esp)
Если ваша функция настроит %ebp
, смещения изменятся прибл. 4:
.text
.globl f
f:
pushl %ebp
movl %esp,%ebp
movl 8(%ebp), %eax
movl %eax, outsave
movl 12(%ebp), %eax
movl %eax, insave
movl 16(%ebp), %eax
movl %eax, cntsave
pop %ebp
ret
Вот что-то похожее на вашу функцию:
int *outsave;
int *insave;
int cntsave;
void
f(int *out, int *in, int nbElements)
{
// do stuff
outsave = out;
insave = in;
cntsave = nbElements;
}
Это вывод сборки:
.text
.globl f
f:
movl 4(%esp), %eax
movl %eax, outsave
movl 8(%esp), %eax
movl %eax, insave
movl 12(%esp), %eax
movl %eax, cntsave
ret
This пример звонящего по номеру f
:
void
f(int *out, int *in, int nbElements);
int outbuf[100];
int inbuf[100];
int bufcnt;
void
g(void)
{
f(outbuf,inbuf,bufcnt);
}
Это сборка для этого:
.text
.globl g
g:
subl $16, %esp
pushl bufcnt
pushl $inbuf
pushl $outbuf
call f
addl $28, %esp
ret