zoukankan      html  css  js  c++  java
  • 自制反汇编工具使用实例 其二(使用xmm寄存器初始化对象,以及空的成员函数指针)

    在反汇编代码中,当看到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); }
  • 相关阅读:
    有序表的合并---顺序表实现
    有序表的合并---链表实现
    双向链表操作
    有序表的合并-用链表操作
    C语言单链表操作
    c语言顺序表操作
    c语言 取余 % 和除法 / 的应用技巧 (在取位数方面的)
    JS打印表格(HTML定义格式)
    富文本编辑器(php)
    利用formdata异步上传图片并预览图片
  • 原文地址:https://www.cnblogs.com/bbqzsl/p/6398934.html
Copyright © 2011-2022 走看看