对于使用内联汇编块对数组进行排序的c代码,存在问题。(+ r)与(= r)的约束
我完整的代码是这样的:
#include <stdio.h>
#define n 20
int main()
{
int array[n];
int i;
int swapped;
printf("Enter the elements one by one \n");
for (i = 0; i < n; i++)
{
scanf("%d", &array[i]);
}
printf("Input array elements \n");
for (i = 0; i < n ; i++)
{
printf("%d\n", array[i]);
}
/* Bubble sorting begins */
do
{
swapped = 0;
for (i = 1; i < n; i++)
{
/*
if (array[i] < array [i-1])
{
swapped =1;
int temp = array [i-1];
array [i-1] = array [i];
array[i] = temp;
}
*/
//body of the for loop
//converted to assembly
__asm__ __volatile__("cmp %0, %1;"
"jge DONE;"
"mov eax, %0;"
"mov %0, %1;"
"mov %1, eax;"
"mov %2, 1;"
"DONE: "
: "+r" (array[i]), "+r" (array[i-1]), "=r" (swapped)
: //no input
: "eax", "cc"
);
}
} while (swapped > 0);
printf("Sorted array is...\n");
for (i = 0; i < n; i++)
{
printf("%d\n", array[i]);
}
return 0;
}
出于某种原因,这样做的同时将成为无限循环,但是当我更改修改为swapped
变量"+r" (swapped)
它的工作原理。我查看了两种情况下生成的汇编代码(-save-temp),除了在预期使用“+ r”的情况下将swapped
变量移动到寄存器外,没有注意到任何其他内容。
为什么我需要使用"+r"
?
我会害怕写那样的跳跃。想象一下,编译器展开循环,这将跳到哪里?另外,为什么要为此写入内联asm?编译器应该从C代码中更好地生成。 – 2014-11-03 20:15:59
你正在编译'-masm = intel'吗?我看不到你的命令行。 – 2014-11-03 20:29:07
那么,我唯一的目的就是学习GCC内联汇编。此外,我用__volatile__编译-O0代码,只是为了防止这些类型的优化。 – soofyaan 2014-11-03 20:30:29