Chinaunix首页 | 论坛 | 博客
  • 博客访问: 117148
  • 博文数量: 24
  • 博客积分: 1411
  • 博客等级: 上尉
  • 技术积分: 261
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-07 17:49
文章分类

全部博文(24)

文章存档

2009年(24)

我的朋友

分类:

2009-08-15 16:24:01

CSAPP上的两段讨论

如果 push %esp 的话,push的是原来的%esp,还是-4 之后的%esp?

同样,如果 pop %esp的话,%esp是原值+4,还是从栈里pop出的值?

.............................push_esp.cpp..................................

#include <iostream>

using namespace std;

int push_test()
{
  int rval;

  /*
    movl %esp,%eax
    pushl %esp
    popl %edx
    subl %edx,%eax
    movl %eax,rval
   */

  asm("movl %%esp,%%eax; pushl %%esp; popl %%edx; subl %%edx,%%eax; movl %%eax,%0"
      :"=r" (rval)
      : //no input

      :"%eax", "%edx"
      );
    return rval;
}

int main()
{
  int y = push_test();
    if (y == 0)
      cout << "push the original %esp" << endl;
  return 0;
}


运行,发现push的确实是原来的%esp

............................pop_esp....................................

// 唉~~一直什么都干不下去,竟要靠写博客来督促自己继续走下去

#include <iostream>

using namespace std;


int poptest(int tval)
{
  int rval;
  /*
    push tval
    movl %esp,%edx
    popl %esp
    movl %esp rval
    movl %edx,%esp
   */

  asm("push %1; movl %%esp,%%edx; popl %%esp; movl %%esp,%0; movl %%edx,%%esp"
      :"=r" (rval)
      :"r" (tval)
      :"%edx"
      );
  
    return rval;
}

int main()
{
  int x = 1;
  int y = poptest(x);
  if (x == y)
    cout << "same as { movl 0(%esp),%esp }" << endl;
  return 0;
}


popl %esp 相当于 movl 0(%esp),%esp

这两句也许是程序员一辈子也用不到、甚至见不到的指令了,但是知道是什么还是有好处的。
备忘
阅读(3861) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-07-24 18:43:29

sysenter进入内核后,第一条指令可能就是: popl %esp