汇编课的一些总结

平台:Linux-x86
语法:AT&T(目的操作数在右边,而Intel语法的目的操作数在左边)

—————————–不定期更新——————————-

  1. lea和mov的区别

    这个其实很好看了,lea的语法是 lea s,d 将s的有效地址放入d中。我的理解类似于C语言中对s变量取一次地址,而mov是直接把内容放在d中了。其实lea和add等算术运算更相似。

    举个例子说明二者的异同: lea 2(%eax),%eax 和 add $2,%eax就是一样的功能:把eax存的地址+2,指向了靠后两个的地址

    lea的优点:快,用于地址的运算,只要一拍

  1. call ret leave比较

    call d执行的是如下操作:把当前eip值储存入栈(相当于 pushl %eip),然后跳到d地址(子程序入口)接着走

    ret的前提是栈顶指针esp指向的是一个eip旧值,这样执行ret时把esp指向的地址(eip旧值)放到eip,然后退栈,这样esp也减一

    leave就更厉害了,他针对的是整个栈帧(子程序栈空间),当子程序操作完成后,执行如下操作:esp=ebp ebp=pop()

    也就是ebp恢复成了ebp旧值(主函数的栈底),esp首先跳到指向ebp旧值处,然后因为pop操作,ebp继续减一,变成了主函数的栈顶。

    可以说这些操作都可以由基本的mov push pop dec这些指令组合实现

    要使用子程序时,先pushl %ebp把ebp旧值保存起来,然后mov %esp,%ebp 把ebp变为esp,这样就是子程序的栈底了。

    当子程序完成他的使命后,先leave,再ret,第一步清空子程序栈帧,第二步把eip回复到主程序里继续走。

---以上---