【问题标题】:Problem with increment in inline ARM assembly内联 ARM 程序集的增量问题
【发布时间】:2010-04-25 14:43:28
【问题描述】:

我有以下内联 ARM 程序集,它在调试版本中工作,但在 iphone sdk 3.1 的发布版本中崩溃。问题是添加指令,我将 C 变量输出和 x 的地址增加 4 个字节,这应该增加浮点数的大小。我认为当我在某个这样的阶段增加时,我正在覆盖某些东西,谁能说这是处理这个问题的最佳方法

谢谢

asm 正在替换的 C 代码,sum、output 和 x 都是浮点数

for(int i = 0; i< count; i++)
 sum+= output[i]* (*x++)

 asm volatile(

    ".align 4 \n\t"
    "mov r4,%3    \n\t"  
    "flds s0,[%0]           \n\t"
    "0:                   \n\t"
    "flds s1,[%2]           \n\t"
    //"add %3,%3,#4         \n\t"
    "flds s2,[%1]           \n\t"
    //"add %2,%2,#4         \n\t"
    "subs r4,r4, #1         \n\t"
    "fmacs s0, s1, s2        \n\t"
    "bne 0b                 \n\t"
    "fsts s0,[%0]               \n\t"
    :
    : "r" (&sum), "r" (output), "r" (x),"r" (count)
    : "r0","r4","cc", "memory", 
        "s0","s1","s2"                         
    );

【问题讨论】:

    标签: iphone assembly


    【解决方案1】:

    你的意思是 %1 加上 4 和 %3 吗?如果在您的函数之后再次使用该寄存器,添加到 %3 可能会导致损坏。

    asm易失性( ".align 4 \n\t" "mov r4,%3 \n\t" "flds s0,[%0] \n\t" “0:\n\t” "flds s1,[%2] \n\t" "添加 %2,%2,#4 \n\t" "flds s2,[%1] \n\t" "添加 %1,%1,#4 \n\t" “潜艇 r4,r4, #1 \n\t” "fmacs s0, s1, s2 \n\t" "bne 0b \n\t" "fsts s0,[%0] \n\t" : : "r" (&sum), "r" (输出), "r" (x),"r" (计数) :“r0”,“r4”,“cc”,“内存”, "s0","s1","s2" );

    【讨论】:

    • 嗨,非常感谢,你能看到加速这个循环的任何方法或我应该使用的任何技术
    • 很遗憾,您不能在 flds 上添加 ,#4。即使您预先计算了 %2 或 %1 的最终值,以便您可以摆脱 subs r4,r4,#1 ,您也必须将其替换为 cmp rx,%2 并且仍然需要条件分支。是否有相当于 ldm 的浮点数?一次读取多个浮点寄存器可能会使内存系统更快。取决于总线以及是否有这样的指令。
    • 不幸的是,您不能在 flds 上添加 ,#4 是说我不能这样做“添加 %2,%2,#4”这会导致崩溃吗?请你说为什么我不能这样做“添加 %2,%2,#4”
    • 不,当加载正常的非浮点寄存器时,您可以执行 ldr r0,[r1],#4 ,它会在 ldr r0,[r1] 上保存一条指令;添加 r1,r1,#4,但是当我尝试 flds s2,[%1],#4 时它抱怨,即使 %1 是一条正常指令,flds 不提供后增量。
    猜你喜欢
    • 2019-12-12
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多