在反汇编代码中,当看到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*))0);
}

转载于:https://www.cnblogs.com/bbqzsl/p/6398934.html

自制反汇编工具使用实例 其二(使用xmm寄存器初始化对象,以及空的成员函数指针)...相关推荐

  1. [Reprint]C++普通函数指针与成员函数指针实例解析

    这篇文章主要介绍了C++普通函数指针与成员函数指针,很重要的知识点,需要的朋友可以参考下 C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般函数 ...

  2. 指针--用指针变量作函数参数的实例(按值调用与模拟按引用调用)、函数指针及其应用

    一.用指针变量作函数参数的实例 思考题: 例题:从键盘输入某班学生某门课成绩(每班人数最多不超过40人,具体人数由键盘输入),是分析下列程序是否能实现计算并输出最高分以及相应学号. #include ...

  3. 学习ARM反汇编工具objdump和一个简单实例

    学习ARM反汇编工具objdump和一个简单实例 --参考朱有鹏ARM裸机编程 1.反汇编的原理&为什么需要反汇编 arm-linux-objdump -D led.elf > led_ ...

  4. 自制反汇编逆向分析工具 迭代第六版本 (一)

    这个版本主要在逆向代码输出上做功夫.首先就是对反汇编代码指令的直译,寻址访问则适配成结构体成员访问或数组访问的方式,使更加直观,效果图如下: 另一图: 接着就是有关SSE指令的直译: 直译中并没有对检 ...

  5. 程序员的吸星大法-IDA反汇编工具初探

    看过<<笑傲江湖>>的朋友一定知道吸星大法吧,这是一种可以吸取他人内功来使自己功力增长的神功,(段誉的北冥神功也是这样, 扯远了...).对于程序员来说,增长自己编程功力的一个 ...

  6. (转)逆向与反汇编工具

    第 1 章           逆向与反汇编工具 了解反汇编的一些背景知识后,再深入学习IDA Pro之前,介绍其他一些用于二进制文件的逆向工程工具,会对我们学习有所帮助.这些工具大多在IDA之前发布 ...

  7. Java反汇编工具hsdis-jitwatch使用

    原文链接 hsdis && jitwatch hsdis是java反汇编工具,可查看java汇编实现 jitwatch不仅能够看到汇编实现,并且有UI界面版本可以切换汇编语言.查看字节 ...

  8. c语言反汇编工具,PVDasm 反汇编工具

    Proview (a.k.a PVDasm) Disassembler, 唯冠 (又名 PVDasm) 反汇编器,PVDasm 是自由. 互动. 适用于多种 CPU (英特尔 80 x 86 / Ch ...

  9. Linux 反汇编工具,逆向与反汇编工具

    逆向与反汇编工具 了解反汇编的一些背景知识后,再深入学习IDA Pro之前,介绍其他一些用于二进制文件的逆向工程工具,会对我们学习有所帮助.这些工具大多在IDA之前发布,并且仍然可用于快速分析二进制文 ...

最新文章

  1. 2008年上半年程序员考试试题分析
  2. Python入门100题 | 第021题
  3. linux cer证书转为jks,常见SSL证书格式介绍以及SSL证书格式转化方法
  4. 小车自动往返工作原理_自动气象站的工作原理介绍
  5. libxml -- 解析 XML 文档
  6. ul、li列表简单实用代码实例
  7. 20165322 第二周结队编程-四则运算
  8. 【python】python的环境搭建
  9. 佳博LabelShop模板文件转成佳博打印机指令软件
  10. 社区论坛小程序源码,功能齐全,简洁漂亮,前端+后端
  11. 基于OpenSSL,实现C语言SM2的PKCS10的证书请求
  12. 《水浒传》108将的绰号(ZZ)
  13. java将英文字符(无论大小写)转化为小写
  14. jpg转换为eps_在线JPG到EPS转换器
  15. 老域名如何选择才能帮助优化?
  16. 002.西门子M440变频器端子控制正反转
  17. 关于C++传递数组时初始化注意事项(允悲)
  18. 26岁转行软件测试,目前34了,分享一些我的经历和感受
  19. 职称评审电子信息工程计算机技术总结,电子信息工程专业工程师中级职称申报.docx...
  20. 2023年【危险化学品经营单位安全管理人员】最新解析及危险化学品经营单位安全管理人员考试技巧

热门文章

  1. 判断一句话是否中文或者英文
  2. 雨量水位监测站 水情监测
  3. 麻省理工学院从算法层面揭示男女配对的自然法则(扎心真相!!!)
  4. word中对号、差号、圈的快速插入
  5. 【MongoDB】01、MongoDB基础
  6. 通过本地客户端连接GoogleCloud的Linux虚拟机
  7. java io 对象_JAVA基础知识之IO——对象序列化
  8. 一起摇摆html5游戏,和 transformjs 一起摇摆
  9. 持续集成Jenkins+Gitlab实现持续集成
  10. unity加速传感器的应用