首页 > 技术文章 > 20135321 & 20135323 家庭作业4.46

20135323fuyunjin 2015-11-03 15:17 原文

* * 4.46

修改对家庭作业4.45所写的代码,用条件传送来实现冒泡排序函数的内循环中的测试和交换。

 

该冒泡排序的内循环是:

for(j=0; j!=i; ++j)
        {
            if( *p > *q )
            {
                int t = *p;
                *p = *q;
                *q = t;
            }
            p++, q++;
        }

根据C语言的内循环结构,可以进行改写成以下的内循环汇编代码:

 

InnerLoop内改成:(edx循环利用)

 

movl (%ecx), %edx

 

InnerLoop:

movl %edx, %eax //%edx存储的值赋给%eax

movl 4(%ecx), %ebx

subl %ebx, %eax  //比较%ebx所存储的指针*p的值与%eax中所存储的*p+1)的值,相当于C语句的条件表达式中的*p>*(p+1)?(*p<*(p+1)):(*p>*(p+1))中问号前的部分

cmovl %ebx, %edx   //比较出来得到%ebx所存储的*p小于%edx存储的值,即%edx是存储的是最大的值

movl (%ecx), %eax  //%ecx地址值赋给%eax

cmovg %ebx, %eax     //比较出来得到%ebx所存储的*p大于%eax的值,即%eax所存储的是最小的值

 

movl %edx, 4(%ecx)

movl %eax, (%ecx) //%eax的值指向%ecx

movl $4, %eax //初始化%eax4

addl %eax, %ecx

movl $1, %eax //%eax的值赋为1

subl %eax, %esi //计算%eax - %esi并作为返回值

jne InnerLoop

 

推荐阅读