void CDsexampleDlg::SelectOrder() { int count =m_list_num1.GetCount(); int * arr = new int[count]; char nums[3]; for (int i=0; i< count; i++) { memset(nums,0,3); m_list_num1.GetText(i,nums); arr[i] = atoi(nums); } DoOrder(arr,count);//调用排序 m_list_num1.ResetContent(); for (i=0; i<count; i++) { memset(nums,0,3); itoa(arr[i],nums,10); m_list_num1.AddString(nums); } delete [] arr; } /************************************************************************/ /* 排序方法 */ /************************************************************************/ void _stdcall DoOrder(int * parray,int count) { int temp =0; //版本一[使用数组] // for (int i=0; i<count-1; i++) // { // for (int j=0; j<count-i-1; j++) // { // if (parray[j]>parray[j+1])//升序排列 // { // temp = parray[j]; // parray[j] = parray[j+1]; // parray[j+1] = temp; // } // } // } //版本二[使用指针] // for (int i=0; i<count-1; i++) // { // for (int j=0; j<count-i-1; j++) // { // if (*(parray+j) > *(parray+j+1))//升序排列 // { // temp = *(parray+j); // *(parray+j) = *(parray+j+1); // *(parray+j+1) = temp; // } // } // } //版本三[使用汇编,纯属于研究] __asm { mov ecx,0 //ecx作外循环计数器i beginforouter: //外循环开始 mov ebx,[ebp+0xC] //ebx计数器上限值mov ebx,count-1 sub ebx,1 //ebx计数器上限值mov ebx,count-1 cmp ecx,ebx //i<count-1 jnl exitDoOrder //不小于则退出整个外循环 mov edx,0 //edx作内循环计数器j[内循环开始] sub ebx,ecx //count-i-1[设置内循环计数器上限值] beginforinner: //内循环开始 cmp edx,ebx //;j<count-i-1; jnl endforouter //不小于则退出整个内循环[进入下一轮外循环] mov esi,[ebp+8] //esi中存放要比较的第一个数的地址,注意地址是指针[内循环体开始] mov eax,edx //计算指针指向的新地址[指针运算规则:指针加一实际上等于加上所指类型的字节数] imul eax,type int add esi,eax //parray+j mov edi,esi add edi,type int //parray+j+1 mov eax,[esi] cmp eax,[edi] //*(parray+j) > *(parray+j+1) jng endforinner //if (*(parray+j) > *(parray+j+1)) mov eax,[esi] mov temp,eax //temp = *(parray+j); mov eax,[edi] mov [esi],eax //*(parray+j) = *(parray+j+1); mov eax,temp mov [edi],eax //*(parray+j+1) = temp; endforinner: inc edx //内循环j++ jmp beginforinner //内循环重新开始 endforouter: //内循环结束[开始进入外循环] inc ecx //外循环i++ jmp beginforouter //外循环重新开始 } __asm { exitDoOrder: } } s