2013-09-01 3 views
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" 
    } 

내가 멍청한 놈이고 나는 참으로 그렇게 선택의 여지가 좀이기 때문에 내가 잘못 알고하지 않습니다. 당신이 MASM 구문을 사용하고, 내 컴파일러는 GCC입니다 비주얼 스튜디오를 이용해야하기 때문에 덕분에 어쨌든

답변

0

나는 레아의 ESI, 배열 mov 인 ESI, 배열 바꾸기 때문에 당신의 거품 정렬 작동하지 않습니다, MASM32에 코드를 테스트 I는 VS 시험하지 않아 비 작동, 코드 단편은 인텔 구문이고 & T 구문 여기

공극 거품 정렬 (INT의 * 어레이 INT 않음) {

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 

}이고

이 코드 조각은 가장 높은 순서에서 가장 낮은 순서로 만들기를 원했기 때문에 완벽하게 작동합니다.