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)

これは、投稿したアセンブリでも基本的に同じです。また、CGRect 構造体を使用してメソッドをコンパイルするために obj-c および Mac GCC が使用する「規則」も意味します。x64 ABIパラメーターによると、RDI、RSI、RDX などのレジスターで渡されます。最初の 2 つの RDI と RSI を見ると、明らかに引数が含まれています。最初の 1 つは出力構造体 (CGRect) へのポインター、2 つ目は不透明な構造体 (CGShadingReg) です。

したがって、Mac 上の GCC は次のように変換すると思います。

CGRect myrect = MyFuncReturningRect(param);

これに:

CGRect myrect;
MyFuncReturningRect(&myrect, param);

とにかく、すべてを要約すると、推測した署名が正しいと強く信じています。関数が期待する値を返さない場合は、他の要因が原因です (おそらく、byte ptr [rsi+28h]ダミーではない情報を取得するには値が null でない必要があります)。

于 2012-04-28T09:27:37.843 に答える