CGPatternGetStep () подпись? - PullRequest
       53

CGPatternGetStep () подпись?

0 голосов
/ 29 июня 2011

Кто-нибудь может объяснить, пожалуйста, следующую сборку?

_CGPatternGetStep:
    +0  0007fb86  55                      pushl       %ebp
    +1  0007fb87  89e5                    movl        %esp,%ebp
    +3  0007fb89  53                      pushl       %ebx
    +4  0007fb8a  8b4508                  movl        0x08(%ebp),%eax
    +7  0007fb8d  8b504c                  movl        0x4c(%eax),%edx
   +10  0007fb90  8b5850                  movl        0x50(%eax),%ebx
   +13  0007fb93  89d0                    movl        %edx,%eax
   +15  0007fb95  89da                    movl        %ebx,%edx
   +17  0007fb97  5b                      popl        %ebx
   +18  0007fb98  c9                      leave
   +19  0007fb99  c3                      ret

Я хочу узнать шаг, переданный в методе CGPatternCreate ( void * info, Границы CGRect, Матрица CGAffineTransform, CGFloat xStep, CGFloat yStep, CGPatternTiling плитка, bool isColored, const CGPatternCallbacks * обратные вызовы );

Я хочу найти значения xStep и yStep? У меня есть CGPatternRef со мной. Можно ли использовать разбор функции выше для получения xStep и yStep?

1 Ответ

2 голосов
/ 29 июня 2011
pushl       %ebp
movl        %esp,%ebp
pushl       %ebx

Установить фрейм стека и сохранить регистр ebx.

movl        0x08(%ebp),%eax

Загрузить первый аргумент стека (из ebp + 8) в eax.

movl        0x4c(%eax),%edx

Загрузить 32-битное значение из поля со смещением 0x4C от адреса в eax в edx.

movl        0x50(%eax),%ebx

Загрузить 32-битное значение из поля со смещением 0x50 от адреса в eax в ebx.

movl        %edx,%eax
movl        %ebx,%edx

Переместить ранее загруженные значения в eax и edx соответственно.

popl        %ebx
leave
ret

Восстановить сохраненный регистр ebx, разобрать кадр стека и вернуть.

Поскольку код устанавливает как eax, так и edx непосредственно перед возвратом, мы можем заключить, что тип возвращаемого значения 64-битный. Вы также можете заметить, что две загрузки предназначены для последовательных местоположений (0x4C + 4 == 0x50). Поэтому, скорее всего, первый (и единственный) аргумент - это указатель на структуру, имеющую 64-битный член со смещением 0x4C, и функция возвращает его значение.

typedef struct _CGPattern
{
 ...
 uint64_t step; // offset 0x4C
 ...
} CGPattern;

uint64_t CGPatternGetStep(CGPattern *pat)
{
  return pat->step;
}
...