Подпись CGPatternGetStep()?

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

_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 tiling, bool isColored, const CGPatternCallbacks *callbacks);

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


person RLT    schedule 29.06.2011    source источник


Ответы (1)


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;
}
person Igor Skochinsky    schedule 29.06.2011
comment
Благодарю за ваш ответ. Я немного смущен. На самом деле я пытаюсь определить параметры CGPatternRef CGPatternCreate (void *info, границы CGRect, матрица CGAffineTransform, CGFloat xStep, CGFloat yStep, CGPatternTiling tiling, bool isColored, const CGPatternCallbacks *callbacks); Он имеет xStep и yStep. Я думал, что метод должен возвращать 2 значения xStep и yStep. Я что-то пропустил? - person RLT; 29.06.2011
comment
Тогда, возможно, вам следует задать реальный вопрос с самого начала... Вполне возможно, что эта функция возвращает небольшую структуру из двух 32-битных значений, а не одного 64-битного значения. Без дополнительного контекста вы не сможете различить эти два случая. - person Igor Skochinsky; 29.06.2011
comment
Я протестировал функцию uint64_t CGPatternGetStep(CGPattern *pat); Оказывается, возвращаемое значение — это какая-то фигня. - person RLT; 29.06.2011
comment
@MachinTosh: если вы пытаетесь получить входные значения, можно предположить, что то, что вы извлекаете, будет того же типа — в данном случае CGFloat. Обратите внимание, что числа с плавающей запятой и целые числа не возвращаются одинаковым образом. (Вот почему вам нужно заранее указать всю информацию в вопросе!) - person Peter Hosey; 30.06.2011