非常简单的比较功能不起作用

时间:2016-11-23 04:20:45

标签: assembly arm

我刚刚开始在我的某个课程中学习汇编,并且在编写一个带有两个数组的程序并比较每个元素时遇到问题,然后将较大的值存储回第一个数组。

这是我的代码,带有极其简单的基本注释(请注意,这是在arduino上运行的,因此是asm伪函数):

void sort1 (char *A, char *B, int N) {
  asm(
    "mov a1, %[A];"           // Move address A into a1 
    "mov a2, %[B];"           // Move address B into a2
    "mov a3, %[N];"           // Move array size N into a3

    "mov r1, #0;"  // r1 = 0
    "L1: cmp r1, a3;" // compare r1 and N
         "it ge;"
         "bge end;"  // if r1 >= N, jump to end (end condition of for loop is met)
       "ldrb v1,[a1];" // load a1 into v1
       "ldrb v2,[a2];" // load a2 into v2
       "cmp v1, v2;" // compare v1 and v2
         "it lt;" // if v1 is less than v2
         "strblt v2,[a1];" // store v2 in a1
       "add a1, #1;" // go to next element in array A
       "add a2, #1;" // go to next element in array B
       "add r1, #1;" // r1 = r1 + 1, equivalent to "i++"
       "b L1;" // branch to beginning of loop
    "end:"

    : : [A]"r"(A), [B]"r"(B), [N]"r"(N)  // Substitute C++ variables
    : "a1", "a2", "a3", "r1", "v1", "v2" // Place any registers used here to not clobber
  );  
}

目前我的程序正在回馈相同的数组A和B,无论B中的值是否大于A中的值。

非常感谢任何帮助。对不起,这是一个简单的问题,可能有一个非常简单的解决方案,但大部分都是自学,我正在努力搞清楚问题所在。

1 个答案:

答案 0 :(得分:3)

将所有评论合并到一个答案中:

我对ARM不太了解,但a2只是r1的另一个名称(mov a3, %[N])?如果是这样,尝试使用这两个似乎是一个坏主意。

正如彼得提到的,我可能会使用"记忆"在这里以及" cc"。

此外,似乎不需要CoCreateInstance()。看起来你可以使用%[N](已经是一个寄存器)并保存一个寄存器。

最后,关于你为什么不应该使用gcc的内联asm的标准评论是this