помогите мне с простой процедурой сборки руки iphone под xcode (встроенный или нет) - PullRequest
2 голосов
/ 30 мая 2011

Мне нужно написать простую подпрограмму в сборке руки iphone (под xcode 4) (обычная 32-битная, а не большой палец) и у меня есть проблемы (автономная подпрограмма asm не связывается, а со встроенным у меня проблемы с аргументамии общие ошибки)

Мне нужно собрать такую ​​функцию, как

 void clear_alpha(unsigned char*bits, int width, int height)
{  for(int j=0; j<height; j++)
    for(int i=0; i<width; i++)
    {
        bits[j][i][4] = 0;
    }

}

или около того, кто-нибудь может помочь, tnx

Ответы [ 3 ]

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

См. Мой ответ на этот вопрос о ARM-ассемблере, в нем показано, как условно компилировать ARM-ассемблер только при запуске на устройстве и компиляции для режима ARM, а не Thumb.Ответ также показывает небольшой пример передачи аргументов C в оператор asm ARM.Вы должны использовать упрощенный цикл for, упомянутый выше, а затем преобразовать инструкции в ARM asm.

Пример ARM asm

Имейте в виду, что код, сгенерированный компилятором для этого примера, будетскорее всего, будет так же быстро, как и любой ASM, который вы напишите.Но хороший ASM-кодер сможет работать намного лучше, чем компилятор, когда вы попадаете в более сложные ситуации, в основном потому, что gcc не очень хорош в использовании условных операторов ARM asm.

0 голосов
/ 30 июля 2011

как насчет memset(bits, 0, sizeof(unsigned char)*width*height);

0 голосов
/ 30 мая 2011

Если этот код работает медленно, почему бы не попробовать переписать его

void clear_alpha(unsigned char*bits, int width, int height)
{  
   for(int j=0; j<height; j++)
      for(int i=0; i<width; i++)
      {
          bits[j][i][4] = 0; // this should be [3]
      }
}

Не уверен, что оптимизатор сделал, но индексирование умножается. Вы можете легко заменить 3 умножения в цикле

void clear_alpha(unsigned char*bits, int width, int height)
{  
   char *bits_ptr = bits + 3;
   char *bits_end = bits + height * width * 4;

   for(; bits_ptr < bits_end; bits_ptr += 4) {
       *bits_ptr = 0;
   }
}

Я не запускал это - проверь мою работу, чтобы убедиться, что ты не пересекаешь конец. Теперь вместо 3 умножений у вас есть одно прибавление. Я предполагаю, что ваше третье измерение - 5 (правка: исправлено на основе комментариев), но вы должны это исправить, если я ошибаюсь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...