20135321 & 20135323 家庭作业4.46
* * 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 //初始化%eax为4
addl %eax, %ecx
movl $1, %eax //把%eax的值赋为1
subl %eax, %esi //计算%eax - %esi并作为返回值
jne InnerLoop