杂碎
leave
pop, push
call, ret, leave
这个leave的意思查查是等效做
movl %ebp, %esp
popl %ebp
这个movl %ebp, %esp
…在做毛线
是在恢复栈顶指针
后来有文章提到,如果没有用到栈,就可以不恢复,直接用popl %ebp
比如
int main() {
return 0;
}
在intel的官方文档中使用intel语法,Windows也使用intel语法,而UNIX平台的汇编器一直使用AT&T语法
我的天哪,,我们一直学的是Intel语法,这里的leave是AT&T
语法
语法介绍见:
http://www.cnblogs.com/orlion/p/5765339.html
http://blog.csdn.net/crazyboy2009/article/details/33817025
简单地说区别在于
ATT语法:
第一个为源操作数,第二个为目的操作数
寄存器前用%,立即数前加$
指令操作码的最后一个字母表示操作数大小:
b: byte(1), w: word(2), l: long(4)
x86 和x64 区别
首先是内存地址的范围由32位变成了64位。但是可以使用的内存地址不能大于0x00007fffffffffff,否则会抛出异常。
其次是函数参数的传递方式发生了改变,x86中参数都是保存在栈上,但在x64中的前六个参数依次保存在RDI,RSI,RDX,RCX,R8和 R9中,如果还有更多的参数的话才会保存在栈上