+ -
当前位置:首页 → 问答吧 → 请问call中的堆栈的内容

请问call中的堆栈的内容

时间:2011-05-09

来源:互联网

当从16位的代码段中去调用32位的代码段,压栈应该是cs和eip,
那么应该是栈顶往上4个字节是EIP,可是我发现栈顶往上的第4、3字节
是CS的选择子,请问这是怎么回事?压栈中的内容是怎样顺序的?
(我试了:ebp+2,ebp+4,ebp+6,ebp+8,发觉就是ebp+4中存放的选择子)

codecseg segment use32
  assume cs:codecseg
cstart proc far
  .......
  mov ebp,esp
  mov ax,ss:[ebp+4] ;这里是cseg1的选择子
  ......
  retf  
cstart endp
codecseg ends

cseg1 segment use16  
  assume cs:cseg1
  ....
  call codecseg_sel:offset cstart
  ....
cseg1 ends

作者: leetow2003   发布时间: 2011-05-09

call指令前面加DATA32告知汇编器使用32位数据宽度,这样esp~esp+3保存offset,esp+4~esp+5保存cs。

作者: cppgp   发布时间: 2011-05-09