用C和ARM汇编实现一个Qsort的时候的"奇怪现象"...
请教各位:
今天我写了个快速排序,用C语言写还好,可是我尝试用汇编实现的时候却出现了"奇怪的现象",老师可否帮我分析一下,老师可以看其中的5句话(汇编),不用全部看.
C语言程序如下:
void qsort(int *a, int start, int end)
{ int p,q,temp, *stack,h=0;
stack = (int *) malloc(sizeof(int)*(end - start+1));
stack[h++]=start;
stack[h++]=end;
start = end; //初始状态必须计算
while(h>0)
{
if(start>=end) //若左子树为空
{ //右子树出栈,初始时是根
end = stack[--h];
start = stack[--h];
}
if(start<end)
{
p=start;
q=end;
temp = a[start];
while(p<q)
{
while(temp<=a[q]&&p<q)
q--;
if(p>=q) break;
a[p] =a[q];
p++;
while(a[p]<=temp&&p<q)
p++;
if(p>=q) break;
a[q] = a[p];
q--;
}//while
a[p]=temp;
stack[h++]=p+1;//保存右子树,左子树无须保存
stack[h++]=end;
end=p-1;//进入左子树
} //if
}//while
free(stack);
}//qsort
main()
{
int i ,n,*a;
scanf("%d",&n);
a = (int *)malloc(sizeof(int)*n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
qsort(a,0,n-1);
for(i=0;i<n;i++)
printf("%d ",a[i]);
free(a);
}
对应的汇编程序如下(是C与汇编混合的):
int main()
{
int i ,n,*a;
scanf("%d",&n);
a = (int *)malloc(sizeof(int)*n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
__asm{
mov r8,#0;
mul r1,n,#4
sub r1,r1,#4
mov r6,a
add r7,a,r1
str r6,[r9]
str r7,[r9,#4]!
add r8,r8,#2;
mov r6,r7
Biggest:
cmp r6,r7
ldrcs r7,[r9]
ldrcs r6,[r9,#-4]!
sub r8,r8,#2;
cmp r6,r7
bcs Biggest
mov r4,r6
mov r5,r7
ldr r1,[r6]
ldr r2,[r7]
ldr r10,[r6]
S1:
cmp r4,r5
bcs Insert
ldr r2,[r5]
cmp r2,r10
bcc S2
sub r5,r5,#4
b S1
S2:
add r4,r4,#4
mov r1,r2
S3:
cmp r4,r5
bcs Insert
ldr r1,[r4]
cmp r10,r1
bcs S4
add r4,r4,#4
b S3
S4:
mov r2,r1
sub r5,r5,#4
Insert:
ldr r1,[r4];
mov r1,r10
add r4, r4,#1;
str r4,[r9]
str r7,[r9,#4]!;
add r8,r8,#2;
sub r7,r4,#2;
cmp r8,#0
bcs Biggest;
Exit:
}
for(i=0;i<n;i++)
printf("%d ",a[i]);
free(a);
}
请看这5句:
mov r4,r6
mov r5,r7
ldr r1,[r6]
ldr r2,[r7]
ldr r10,[r6]
我的本意是要5句话全部执行,
可是它只执行了1,2,5句,中间2句
ldr r1,[r6]
ldr r2,[r7]
跑了,想不明白啊????
我就不明白为什么中间2句跑了,我又无条件跳转,
可是我用单步调试的时候编译器真的不执行啊...
请大家赐教!!