2

我正在尝试获取方法 CGShadingGetBounds() 的签名?

我试过了,CG_EXTERN CGRect CGShadingGetBounds(CGShadingRef);但似乎不是这样。

有人可以帮忙找出签名吗?下面是拆解。

__text:000000000016BB76                 public _CGShadingGetBounds
__text:000000000016BB76 _CGShadingGetBounds proc near           ; CODE XREF: _log_LogShading+1B8p
__text:000000000016BB76                                         ; _dlr_DrawShading+1FEp ...
__text:000000000016BB76                 push    rbp
__text:000000000016BB77                 mov     rbp, rsp
__text:000000000016BB7A                 mov     rax, rdi
__text:000000000016BB7D                 cmp     byte ptr [rsi+28h], 0
__text:000000000016BB81                 jz      short loc_16BBAC
__text:000000000016BB83                 movsd   xmm0, qword ptr [rsi+30h]
__text:000000000016BB88                 movsd   qword ptr [rdi], xmm0
__text:000000000016BB8C                 movsd   xmm0, qword ptr [rsi+38h]
__text:000000000016BB91                 movsd   qword ptr [rdi+8], xmm0
__text:000000000016BB96                 movsd   xmm0, qword ptr [rsi+40h]
__text:000000000016BB9B                 movsd   qword ptr [rdi+10h], xmm0
__text:000000000016BBA0                 movsd   xmm0, qword ptr [rsi+48h]
__text:000000000016BBA5
__text:000000000016BBA5 loc_16BBA5:                             ; CODE XREF: _CGShadingGetBounds+5Ej
__text:000000000016BBA5                 movsd   qword ptr [rdi+18h], xmm0
__text:000000000016BBAA                 pop     rbp
__text:000000000016BBAB                 retn
__text:000000000016BBAC ; ---------------------------------------------------------------------------
__text:000000000016BBAC
__text:000000000016BBAC loc_16BBAC:                             ; CODE XREF: _CGShadingGetBounds+Bj
__text:000000000016BBAC                 lea     rcx, _CGRectInfinite
__text:000000000016BBB3                 movsd   xmm0, qword ptr [rcx]
__text:000000000016BBB7                 movsd   xmm1, qword ptr [rcx+8]
__text:000000000016BBBC                 movsd   qword ptr [rdi], xmm0
__text:000000000016BBC0                 movsd   qword ptr [rdi+8], xmm1
__text:000000000016BBC5                 movsd   xmm0, qword ptr [rcx+10h]
__text:000000000016BBCA                 movsd   qword ptr [rdi+10h], xmm0
__text:000000000016BBCF                 movsd   xmm0, qword ptr [rcx+18h]
__text:000000000016BBD4                 jmp     short loc_16BBA5
__text:000000000016BBD4 _CGShadingGetBounds endp

我的目标是确定阴影发生的范围。

4

1 回答 1

1

我相信你提到的签名

CG_EXTERN CGRect CGShadingGetBounds(CGShadingRef);

是正确的。例如,如果您尝试使用自定义对象重建此类函数,如下所示:

typedef struct
{
    long a1, a2, a3, a4, a5;
    char b6;
    CGRect r;
} MyObj;

CGRect ReconstructFunc(MyObj *o)
{
    if (o->b6) return o->r;
    return CGRectNull;
}

当然,这会有所不同,但是“快速”路径(其中 b6 非零)在汇编和行为方面都与原始函数非常相似:

pushq   %rbp
movq    %rsp, %rbp
movq    %rdi, %rax
cmpb    $0, 40(%rsi)
je  LBB0_2
movq    72(%rsi), %rcx
movq    %rcx, 24(%rax)
movq    64(%rsi), %rcx
movq    %rcx, 16(%rax)
movq    48(%rsi), %rcx
movq    56(%rsi), %rdx
movq    %rdx, 8(%rax)
movq    %rcx, (%rax)
popq    %rbp
ret
    ... (continues)

这与您发布的程序集基本相同。它还暗示了一些“约定” obj-c 和 Mac GCC 用于使用 CGRect 结构编译方法。根据x64 ABI参数在这些寄存器中传递:RDI、RSI、RDX(以及更多)。如果你看一下前两个,RDI 和 RSI,它们显然包含参数,第一个是指向输出结构 (CGRect) 的指针,第二个是不透明结构 (CGShadingReg)。

因此,我相信 Mac 上的 GCC 会这样翻译:

CGRect myrect = MyFuncReturningRect(param);

进入这个:

CGRect myrect;
MyFuncReturningRect(&myrect, param);

无论如何总结一下,我坚信你猜到的签名是正确的。如果该函数没有返回您期望的值,则它是由一些其他因素引起的(可能是由该byte ptr [rsi+28h]值引起的,该值必须为非空才能获得一些非虚拟信息)。

于 2012-04-28T09:27:37.843 回答