【问题标题】:help me with simple iphone arm assembly routine under xcode (inline or not)帮助我在 xcode 下使用简单的 iphone arm 装配例程(内联或非内联)
【发布时间】:2012-08-06 06:47:28
【问题描述】:

我需要在 iphone arm 组件中编写简单的例程(在 xcode 4 下) (正常 32 位不是拇指)并且有问题 (独立的 asm 例程不与 内联我遇到 args 和一般错误的问题)

我需要组装一个类似的函数

 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

【问题讨论】:

  • 你应该说明你为什么必须在汇编中重写它的原因。
  • @nikolai ruhe - 1) 我想学习 iphone asm 2) 曾经做过一些测试,发现 iphone 上的 memcpy() 比复制速度快 15 倍 - 这是因为 arm 有命令一次读取和存储 8 个整数(等等) - asm 会快得多,上面的函数很慢
  • 在 c 中获得了更精细的位处理功能,执行需要 80 毫秒,并且我的帧速率低于 10fps(所以我希望稍后在 asm 中重新编写它,并可能实现快 3 倍左右的速度) - 但是这样一个简单的 asm 仍然有问题(我是 iphone xcode 和 arm asm 的新手)
  • memcpy 不能帮你解决这个问题——它是一个字节复制算法——字节不是连续的——所以你不能利用它。
  • @lou franco - 是的,也许,但如果我知道 iphone asm,我也可以选择其他程序 - 所以在我看来,白金值得学习

标签: iphone xcode assembly arm


【解决方案1】:

如果这段代码很慢,为什么不尝试重写它

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(编辑:根据评论修复),但如果我错了,您必须修复它。

【讨论】:

  • tnx 用于回答(但我仍然想在 arm 组件中尝试)它应该是 3 而不是(这是我的错误)它是简单的 rgba 或 bgra pixelmap[height][width][ 4]
  • franco - 非常感谢(这很棒)
  • 请注意,优化编译器很可能会从上述两种变体生成相同的代码,因此这种修改可能只会使您的代码更难阅读,而不是更快。
  • @Ville Krumlinde - 这是一个非常值得怀疑的问题 - 一些 asm ppl 说这绝不是真的,而且生成的 gcc arm asm 特别弱 - 如果我有的话,至少应该对其进行测试asm 示例我可以测量它 - 所以我需要知道如何去做 - 一些但网上的信息不多,所以如果有人能回答我的问题,我将不胜感激
【解决方案2】:

查看我对这个 ARM asm 问题的回答,它展示了如何仅在设备上运行并为 ARM 模式而不是 Thumb 编译时有条件地编译 ARM asm。答案还显示了一个将 C 参数传递到 ARM asm 语句的小示例。您应该使用上面提到的简化 for 循环,然后将指令转换为 ARM asm。

ARM asm example

请注意,编译器为此示例生成的代码可能与您编写的任何 ASM 一样快。但是,当您遇到更复杂的情况时,一个好的 ASM 编码器将比编译器做得更好,主要是因为 gcc 不太擅长使用条件 ARM asm 语句。

【讨论】:

    【解决方案3】:

    memset(bits, 0, sizeof(unsigned char)*width*height);怎么样

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      • 2014-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多