0

所以我有一个任务,我必须使用写为内联汇编函数的冒泡排序对动态分配的数组进行排序。问题是我的汇编函数不适用于动态分配的数组。

int *array;
array=new int[N];                //N=number of elements
for(int i=0;i<N;i++)
{
    //generate random numbers
}

        N--;
    __asm {
            outer_loop:
                    xor  edx, edx       
                    lea  esi, array

                        mov  ecx, N     



            inner_loop:
                    mov  eax, [esi]  
                    mov  ebx, [esi+4]

                    cmp  eax, ebx
                    jae  next_pair   

                    mov  [esi], ebx  
                    mov  [esi+4], eax

                    add  edx, 1      


            next_pair:
                    add  esi,4      
                    dec  ecx         
                    jnz  inner_loop  

                    test edx, edx    
                    jnz  outer_loop  
            }
for(int t=0;t<5;t++)
    {
        cout<<array[t]<<" ";           // it get's stuck here "Unhandled exception" 
    }

我不知道我做错了什么,因为我是个菜鸟,而且我有点别无选择,所以是的。不管怎么说,还是要谢谢你

4

1 回答 1

0

我在 masm32 中测试了您的代码,因为您应该使用使用 masm 语法的 Visual Studio,而我的编译器是 GCC,您的冒泡排序不起作用,因为 lea esi,array 替换为 mov esi,array 可能因为我没有而起作用t在VS中测试,代码片段是intel语法和AT&T语法在这里

无效 BubbleSort(int *array, int n) {

n--;

__asm__ __volatile__(

    "outter_loop:\n"
                     ".intel_syntax noprefix\n" // use intel syntax 
                     "xor  edx,  edx\n"
                     ".att_syntax prefix\n"     //  back to at&t to get parameters
                     "movl %[p], %%esi\n"       //  mov esi, array
                     "movl %[n], %%ecx\n"       //  mov ecx, n     
                     ".intel_syntax noprefix\n"
     "inner_loop:\n"

                     "mov eax, [esi]\n"
                     "mov ebx, [esi+4]\n"
                     "cmp eax, ebx\n"
                     "jae next_pair\n"

                     "mov [esi], ebx\n"
                     "mov [esi+4], eax\n"
                     "mov edx, 1\n"

     "next_pair:\n" 

                     "add esi, 4\n"
                     "dec  ecx\n"
                     "jnz inner_loop\n"
                     "test edx, edx\n"
                     "jnz outter_loop\n"
                     ".att_syntax prefix\n" //  back to at&t again
                     :
                     :[p]"m"(array), [n]"m"(n)
                     : "%eax", "%ebx", "%ecx", "%edx", "%esi"); // clobbered registers

}

好吧,这个代码片段完美地工作,因为你想按从高到低的顺序制作。

于 2013-09-11T12:13:02.773 回答