用C和ARM汇编实现一个Qsort的时候的"奇怪现象"...

Camus_gzw_02 2007-03-21 11:20:24
请教各位:
今天我写了个快速排序,用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句跑了,我又无条件跳转,
可是我用单步调试的时候编译器真的不执行啊...

请大家赐教!!

...全文
391 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
spark_huo 2007-05-29
  • 打赏
  • 举报
回复
编译器认为你的那两条语句是无用功。
你可以在调试的时候查看编译后的汇编,里面就没有你的这两条语句。
你可以写个小程序试一下,只写以下两条语句。
mov r4,r6
mov r5,r7
DEBUG的时候你会发现连断点都设不了,那就是被优化掉了,因为它无用。
另外,你的程序里有些地方很危险的哦,str r6,[r9]。
Camus_gzw_02 2007-03-22
  • 打赏
  • 举报
回复
偶是是想练习汇编,
如果不单步执行,那2句话还是会"跑掉"的..
Camus_gzw_02 2007-03-22
  • 打赏
  • 举报
回复
其实我学习汇编不到2周,可是光看书不做点事情不行啊~~
所以前几天我写了一个"冒泡"排序,
并且计算过时间
汇编确实比C语言的速度快一倍..

现在我"升级"玩"快速"排序,就出现了这个情况影响了我的调试..

谁可以帮我找出真正的原因呢?希望说的具体些,给出具体的可行的解决措施..

谢谢大家..
Camus_gzw_02 2007-03-22
  • 打赏
  • 举报
回复
你也说得太"抽象"了吧
呵呵
Camus_gzw_02 2007-03-22
  • 打赏
  • 举报
回复
是"聪明"的编译器帮你跳过了。

不明白..

的确我是汇编的初学者,而我打算调试成功之后再把指令精简一下,指令的确是有冗余的..

但我得首先搞明白这个原因..
fscd 2007-03-22
  • 打赏
  • 举报
回复
是"聪明"的编译器帮你跳过了。
还有你的汇编并不比C编译出来的代码有优势,还是用C吧
fscd 2007-03-22
  • 打赏
  • 举报
回复
ARM还用汇编干吗,用C不好吗.
大熊猫侯佩 2007-03-22
  • 打赏
  • 举报
回复
如果不单步执行会如何
Camus_gzw_02 2007-03-22
  • 打赏
  • 举报
回复
补充一下:
我是用ADS1.2做编译的...
而且无论我如何调整这5句话的顺序,那2句话还是会"跑掉"的.
Camus_gzw_02 2007-03-22
  • 打赏
  • 举报
回复
我顶!
不要沉啊~~~~~~~~~~~~~~~~~~~~~~~~~

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧