第三章、汇编3

过程

运行时栈

首先看看运行时栈的布局:
在这里插入图片描述
解释一波:

  • 当函数P调用Q的时候,首先为要为Q准备参数,6个参数的时候可以放在寄存器里,当多于6个参数的时候可以暂存在栈里。这里注意,实际Q的第七个参数是从rsp的位置开始往上加, para7=rsp+8, para8=rsp+16(注意,不管参数数据大小,都是8字节往上加,即使不够空着也不用), 这里的参数构造区就是Q函数的参数位置,图里的参数7是P的参数构造区,这里不要误会。
  • 当执行call的时候,会把pc寄存器中的下一条的指令地址暂存在栈中,也就是上图中的返回地址,而ret就是把栈里值pop出去pc寄存器中。
  • 如果Q中要用一些寄存器,但是这个寄存器被P占用了,这个时候需要把寄存器中的值暂存在被保存的寄存器<这个应该放在P桢中,是P的责任>,但是这里要注意了,图中的被保存寄存器是Q要调用其他函数时,提前把一些寄存器值存好,这个责任是调用者的责任,而不是被调用者的责任。
  • 接下来函数Q中的局部变量有些需要放在栈上,1.放一些寄存器不足时的local数据 2.函数中&运算符的变量,毕竟需要拿到地址,不能放在寄存器 3.数组或者数据结构

数组分配和访问

  • 普通数组
  • 二维数组
  • 定长数组
    学习一下gcc的优化技巧,二维数组访问会比较慢,优化的时候最好用一维指针去遍历。
  • 变长数组
    有点神奇,用的不多

结构

这一节主要知识是,对于基础对象,元素的偏移地址必须是其大小的整数倍(其实前提条件是取数指令都是8的整数倍,书里没有交代,默认都是所有芯片都是这样)

GDB

栈溢出

浮点代码

  1. 浮点数寄存器:
  • 16个寄存器,ymm0-15(255bit), xmm(128bit)
  • ss(单精度), sd(单精度)
  • 所有指令首字母为v, 比如vmovsd
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值