在反汇编代码中,当看到xmm寄存器,第一反应是将要进行浮点操作或访问,但是更加多的情况是在使用xmm寄存器初始化局部对象。

下面是自制反汇编工具翻译出来的代码:

// -[CALayer setAllowsEdgeAntialiasing:]
void CALayer20_setAllowsEdgeAntialiasing3A_(id self, SEL sel, uintptr_t setAllowsEdgeAntialiasing)
{
// 0 pushq %rbp
// 1 rbp = rsp;
// 4 rsp = rsp - 0x20;
// 8 rax = CALayer._attr;
// 15 rdi = rax->_rdi._8;
// 20 xmm0 = 0.; ;
// 23 ((float*)&_10)[0] = xmm0.ps[0]; ((float*)&_10)[1] = xmm0.ps[1]; ((float*)&_10)[2] = xmm0.ps[2]; ((float*)&_10)[3] = xmm0.ps[3]; ;
// 27 rax = _10;
// 31 rcx = _8;
// 35 rsp->_8 = rcx;
// 40 rsp->_0 = rax;
// 44 r8d = (uint32_t)(uint8_t&)dl;
// 48 esi = 0xb;
// 53 edx = 0x1d;
// 58 ecx = 0x67;
// 63 call
((CA::Layer*)rax->_rdi._8)->set_bit((unsigned int)0xb, (unsigned int)0x1d, (unsigned int)0x67, (bool)dl, (void (CA::Layer::*)(CA::Transaction*))r9);
// 68 rsp = rsp + 0x20;
// 72 popq %rbp /*****
* global variables
*
*/ // 8 extern ent_off__0x648d0; movq 0x648c1(%rip), %rax; CALayer._attr
}

首先对函数原型进行分析,对下面翻译代码对rdx的访问使用分析,可以知道作为dl访问,通常是作为布尔类型使用,从而得到setAllowsEdgeAntialiasing的参数类型应该是布尔类型。

在翻译代码唯一的一处函数调用,CA::Layer::set_bit的调用中,最后一个参数是一个成员函数指针,这个成员函数指针不是一个指针而是一个结构体(请参看前面《函数指针和成员函数指针有什么不同,反汇编带看清成员函数指针的本尊(gcc@x64平台)》,不能直接使用寄存器传递,这里应该使用栈来传递。也就是xmm0寄存器用来初始化了一个成员函数指针,并且初始化了一个为空的成员函数指针(结构体)。也就是上面在set_bit函数中传递了一个为空的成员函数指针(请区分好普通指针)。根据参考前面的方面,可知成员函数指针结构体有两个成员变量,在x64体系中,正是16字节(128位)大小,用一条媒体指令就可以将xmm0寄存128位赋值0,并且然后只要一条写内存指令,方便cpu进行超示量。

翻译的最后结果是:

// -[CALayer setAllowsEdgeAntialiasing:(bool)]
void CALayer20_setAllowsEdgeAntialiasing3A_(id self, SEL sel, uintptr_t allowsEdgeAntialiasing)
{
// 63 call
((CA::Layer*)self->_attr._8)->set_bit((unsigned int)0xb, (unsigned int)0x1d, (unsigned int)0x67,
                        (bool)allowsEdgeAntialiasing, (void (CA::Layer::*)(CA::Transaction*)));
}

最新文章

  1. css的relative和position探究
  2. 连锁机构3D指纹考勤系统解决方案
  3. Excel批量插入多行
  4. quick lua 3.3常用方法和学习技巧之transition.lua
  5. 关于yum仓库的中的软件包下载
  6. 从JavaScript的移位运算看数字在计算机内部的编码——补码
  7. 【Xamarin开发IOS-IOS生命周期】
  8. android spinner 每行字体颜色都变化
  9. 玩转SSH端口转发
  10. 【nodejs】nodejs 的linux安装(转)
  11. 第二次项目冲刺(Beta阶段)--第四天
  12. [usaco6.1.1Postal Vans]
  13. .net下的缓存技术
  14. hangfire使用笔记
  15. net4log 添加自定义变量
  16. laravel 连表查询数据库
  17. Scala进阶之路-Scala特征类与unapply反向抽取
  18. Linux中mkdir和touch命令区别
  19. struts2 constant详解
  20. Java堆外内存之七:JVM NativeMemoryTracking 分析堆外内存泄露

热门文章

  1. win10下安装openssl
  2. Ubuntu 16.04下配置 Nginx 与 Node.js 以及服务的部署
  3. 百万年薪python之路 -- 生成器
  4. 你的 Java 并发程序 Bug,100% 是这几个原因造成的
  5. javascript单线程,异步与执行机制
  6. win8 批处理自动填写ip
  7. Java多线程编程(七)线程状态、线程组与异常处理
  8. 游图邦YOTUBANG是如何搭建生态系统的?
  9. beanFactory 设计模式 Bean 生命周期的胡言乱语,哈哈
  10. 学习笔记64_k邻近算法