一 linux相关问题
二 汇编相关指令记录
0.一段汇编代码
int simple(int *xp, int y)
{
int t = *xp + y;
*xp = t;
return t;
}
汇编后:
simple:
pushl %ebp //save frame pointer
movl %esp, %ebp //create new frame pointer
movl 8(%ebp), %edx //retrieve xp
movl 12(%ebp), %eax //retrieve y
addl (%edx), %e ax //add *xp to get t(这里完成了把t作为返回值)
movl %eax, (%edx) //store t at xp
popl %ebp //restore frame pointer
ret //return
疑点解答1: x32程序 中 ,函数用 %eax 作为返回值。
疑点解答2: 这里将esp 赋给ebp 是为了方便计算偏移
pushl %ebp
movl %esp,%ebp
此时堆栈情况:
int y ; ebp + 12
int *xp; ebp + 8
1.leal -8(%ebp), %eax
leal -8(%ebp), %eax //ebp-8 -> eax
取出ebp寄存器的值并减去8赋给eax寄存器,不进行间接寻址,直接把传送地址
2.movl -8(%ebp), %eax
movl -8(%ebp), %eax //(ebp-8)->eax
取出ebp的值减去8,然后再读取(ebp-8)所指向的内存的内容,赋给eax ,进行了间接寻址取出变量值(内容)
3.andl $-16, %esp
and 是将后边两个操作数按位求&,加l表示后边两个操作数是4个字节32bit的
第一个$-16就是一个数-16,4字节int表示为0xfffffff0,第二个%esp是一个寄存器,里边存放的是栈指针所指向的内存地址(4个字节),该命令表示将寄存器里存的4字节地址与0xfffffff0按位就&,并将结果存在寄存器%esp中。
作用应该是调整栈指针的地址
4 pushl %ebp
5 寄存器名称结构
(x1)(x2)(x3)
x1:e表示32位,r表示64位,空表示16位
x2:s表示stack,b表示堆
x3:x表示寄存器,p表示指针
参考网址
http://www.360doc.com/content/09/1230/12/510771_12295954.shtml
https://zhidao.baidu.com/question/185472732.html
https://blog.csdn.net/xq734536013/article/details/50310961?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-50310961-blog-93170087.pc_relevant_aa2&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-50310961-blog-93170087.pc_relevant_aa2&utm_relevant_index=1
https://blog.csdn.net/wojiuguowei/article/details/79029964
https://www.likecs.com/ask-5845731.html
https://zhuanlan.zhihu.com/p/164408752
https://blog.csdn.net/weixin_42128537/article/details/112655653