При вызове любой подпрограммы в стек кладётся адрес «родителя». Путём банального эксперимента было установлено, что регистр eip сохраняется по адресу esp+4 в стеке. По идее cs должен быть сохранён по адресу esp. Для этого я так же решил провести эксперимент. Вот программа.
foo.s:
.code32
.globl cs_par, cs
.text
cs_par:
pushl %ebp
movl %esp,%ebp
movl (%ebp),%eax
popl %ebp
ret
cs:
xorl %eax,%eax
movw %cs,%ax
ret
#include <stdio.h>
extern int cs_par (void);
extern int cs (void);
int main ()
{
printf ("cs_par = %X ", cs_par ());
printf ("cs = %X ",cs ());
return 0;
}
cs_par = BFD8F228 cs = 73