在堆栈上推送段寄存器以进行远程调用

时间:2017-08-31 02:23:42

标签: pointers architecture stack segment

当硬件推送堆栈上的段寄存器以保存远指针,因为调用过程在另一个段中调用了一个过程,显然,它不会保存段寄存器的不可见部分(缓存的段描述符部分)和只保存选择器部分。

当然,这很好,因为它为您提供了访问描述符所需的全部知识。

但是,选择器只有16位,如果你的寻址默认大小是32或64,那么进程看不到的硬件将推动堆栈上的段选择器并将堆栈指针递增4或8字节,尽管事实上,选择器只需要2。

这是为了保持堆栈指针对齐,这很重要。

我的问题是:硬件用什么来填补额外的字节?

是否签名扩展选择器?

它是否会扩展选择器?

它只是按下两个选择器字节,然后将堆栈指针再跳过2或6,留下最初单独存在的东西吗?

感谢。

1 个答案:

答案 0 :(得分:0)

根据英特尔64和IA-32架构软件开发人员手册第2卷(link)中的PUSH指令条目

  

如果源操作数是段寄存器(16位)和   操作数大小为64位,推入零扩展值   堆栈;如果操作数大小为32位,则为零扩展   值被压入堆栈或段选择器被写入   堆栈使用16位移动。对于最后一种情况,所有最近的Core和Atom   处理器执行16位移动,留下上半部分   堆栈位置未经修改。

因此,根据操作数大小,似乎0或者保持未修改的内容。