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) |