我刚刚开始在我的某个课程中学习汇编,并且在编写一个带有两个数组的程序并比较每个元素时遇到问题,然后将较大的值存储回第一个数组。
这是我的代码,带有极其简单的基本注释(请注意,这是在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中的值。
非常感谢任何帮助。对不起,这是一个简单的问题,可能有一个非常简单的解决方案,但大部分都是自学,我正在努力搞清楚问题所在。
答案 0 :(得分:3)
将所有评论合并到一个答案中:
我对ARM不太了解,但a2
只是r1
的另一个名称(mov a3, %[N]
)?如果是这样,尝试使用这两个似乎是一个坏主意。
正如彼得提到的,我可能会使用"记忆"在这里以及" cc"。
此外,似乎不需要CoCreateInstance()
。看起来你可以使用%[N](已经是一个寄存器)并保存一个寄存器。
最后,关于你为什么不应该使用gcc的内联asm的标准评论是this。