#include <stdio.h>
int main()
{
long l, k;
asm("mov %%rsp,%0" : "=r"(l));
asm("mov %%rbp,%0" : "=r"(k));
printf("Stack pointer: 0x%16.16lX\n", l);
printf("Stack frame base: 0x0%16.16lX\n", k);
printf("Distance to return address: %ld\n", k-l);
}
snow ~ $ ./test
Stack pointer: 0x00007FFC95B793C0
Stack frame base: 0x000007FFC95B793D0
Distance to return address: 16
Очевидно, что это не переносимо, я предполагаю, x64 и gcc здесь.
Предостережение: BP не всегда будет указывать на обратный адрес. Иногда он не используется как указатель кадра стека, и некоторые функции могут не возвращать свои значения в стеке. Оптимизация регистра сломает его. Локальные переменные могут сломать его. Переменные выравнивания слов могут нарушить его. В принципе, не рассчитывайте, что это сработает. (Я полагаю, что в зависимости от параметров компилятора / времени компиляции вам также может понадобиться добавить к этому постоянное смещение.)
Мне действительно интересно, нет ли лучшего способа сделать то, что вы пытаетесь сделать ... =)