2012-04-27 5 views
2

メソッドCGShadingGetBounds()のシグネチャを取得しようとしていますか?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 

私の目的は、シェーディングが起こる境界を特定することです。

答えて

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を見れば、明らかに引数があります。最初は出力構造体(CGRect)へのポインタであり、2つ目は不透明な構造体(CGShadingReg)です。この中

CGRect myrect = MyFuncReturningRect(param); 

したがって、私はGCCは、Mac上で、この変換と信じてそれをすべて合計するとにかく

CGRect myrect; 
MyFuncReturningRect(&myrect, param); 

を、私は強くあなたの推測の署名が正しいと信じています。関数が期待した値を返さない場合は、その他の要因(恐らくの値)によって引き起こされます。ダミー以外の情報を取得するにはnullでなくてはなりません。

関連する問題