【问题标题】:convert x86 asm code to arm code on iOS在 iOS 上将 x86 asm 代码转换为 arm 代码
【发布时间】:2011-09-11 02:24:41
【问题描述】:

谁能帮我将以下 x86 内联 asm 代码转换为 arm 格式?

bool N_FLAG = 0;
bool C_FLAG = 0;
bool Z_FLAG = 0;
bool V_FLAG = 0;

asm  ("sub %1, %%ebx;"\
"setsb N_FLAG;"\
"setzb Z_FLAG;"\
"setncb C_FLAG;"\
"setob V_FLAG;"\
: "=b" (reg[dest].I)\
: "r" (reg[base].I), "b" (value));

【问题讨论】:

    标签: ios assembly x86 arm inline-assembly


    【解决方案1】:

    把它转换成 C 怎么样?

    看起来代码减去两个数字(value - reg[base].I),将结果存储到reg[dest].I,然后检查各种标志。

    所以有些东西(粗略,未经测试),例如:

    reg[dest].I = value - reg[base].I;
    Z_FLAG = (reg[dest].I == 0);
    N_FLAG = (reg[dest].I < 0);
    /* repeat for: carry, overflow */
    

    然后让编译器发挥它的魔力? ARM gcc 编译器在将这类东西映射到正确的 ARM 指令方面也不错。

    如果您想进行 ARM 汇编,您可能正在考虑使用条件移动指令,例如(快速编写 - 未经测试):

    __asm__ (
    "subs %[out], %[in2], %[in1]\n\t"
    "movmi %[N_FLAG], #1\n\t"
    "moveq %[Z_FLAG], #1\n\t"
    "movcs %[C_FLAG], #1\n\t"
    "movvs %[V_FLAG], #1\n\t"
    : [N_FLAG]"+r"(N_FLAG), [Z_FLAG]"+r"(Z_FLAG), [C_FLAG]"+r"(C_FLAG), [V_FLAG]"+r"(V_FLAG), [out]"=r" (reg[dest].I)
    : [in1]"r" (reg[base].I), [in2]"r"(value))
    : "cc"
    );
    

    【讨论】:

    • 谢谢,它有效。多亏了你,我现在知道 '[]' 是什么意思 :) 但我仍然怀疑当 "movmi %[N_FLAG], #1\n\t" 失败时,N_FLAG 将设置为 0。
    • @KarlYu:movmi 不能失败。如果数字为负数,它将 1 移入 N_FLAG。如果为正,则为 0。这与 setsb 在 x86 程序集中执行的功能相同。如果此答案正确且对您有所帮助,请采纳!
    • 不,这不会将任何标志变量设置为 0,它会使它们保持不变。
    • @TimothyBaldwin 如果您查看问题,您会看到标志变量被初始化为零,因此保持不变(零)是所询问的人正在寻找的......
    • @TimothyBaldwin:我看到了你提议的编辑,我同意。子必须是子...
    【解决方案2】:

    此代码适用于我使用 clang:

    int sub(int a, int b)
    {
      int c;
      asm ("sub %0, %2, %1" : "=r" (c) : "r" (b), "r" (a));
      return c;
    }
    

    注意寄存器参数之间的逗号。

    【讨论】:

    • 感谢您的回答。但是还是不能通过step链接,可以用xcode gcc4.2试试吗?
    • 在 gcc 4.2.1 中为我工作。查看反汇编,它没有产生任何无法链接的东西。我敢打赌,由于固定的偏移量,您会遇到重定位错误。什么是链接器错误?
    • 这似乎是我的代码问题而不是 arm 代码本身,谢谢。
    猜你喜欢
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多