2010-05-11 4 views
2

아래 코드에서 for 루프를 인라인 어셈블리로 변환하려면 어떻게해야합니까? (사면이 이상한 코드, 난 그냥 그것을했다.)인라인 어셈블리

1)이이 "어떻게 라인 어셈블리에서 사용하는"질문이 아닌 것입니다) 비주얼 스튜디오

2를 사용하여 x86 용입니다 "이 코드를 최적화하는 방법"질문

3) 다른 예는 괜찮을 것입니다. 나는 abit에서 더 좋은 예제 코드를 생각할 것이다.

OK 난이 더 좋은 예입니다 희망 :

int doSomething(double a, double b, double c) 
{ 
    double d; 
    for(int i=100;i<200;i++) 
    { 
     d = a*a + b*b + c*c; 
     if(d>i) 
      return (i-99); 
    } 
    return -1; 
} 
+6

이렇게하는 것이 좋은 이유가 있습니까? 알맞은 컴파일러는 멍청한 어셈블리 프로그래머가 할 수있는 것보다 훨씬 좋은 일을 할 것입니다. 그리고 당신은 어떤 CPU를 목표로하고 있습니까? –

+3

또한 코드에는 루프 내부에 중복 표현이 있습니다. 두 번째 줄은 b가 즉시 c로 대체되어 무의미합니다. 최적화하기 전에 코드를 수정해야 할 수도 있습니다. –

+3

또 다른 한가지 - 루프 자체는 루프 내부에서 모든 표현식이 루프 불변이므로 중복됩니다. 너 정말 이걸 생각하지 않았 니? 어떤 아키텍처에서 –

답변

5

아마도이 불완전하고 다소 비효율적 인 예와 같이 시작될 것입니다. 그래도 구문을 보여 주어야합니다.

double doSomething(void) { 
    double a=1,b=2,c=3; 
    __asm { 
     mov ecx,10 
loop: 
     fld a // a 
     fmul st(0),st(0) // aa 
     fld b // b aa 
     fmul st(0),st(0) // bb aa 
     fsubp // aa-bb 
     fstp c // c = a*a-b*b 

     // and so on 

     dec ecx 
     jnz loop 
    } 
    return a+b+c; 
} 

SSE 명령어를 사용하는 것이 다른 옵션입니다.

벤처 캐피탈 ++ 인라인 어셈블러는 여기에 설명되어 있습니다 : http://msdn.microsoft.com/en-us/library/4ks26t93.aspx

인텔 프로세서의 참조 설명서 현재 위치 :

+0

좋은 답변입니다. +1 –

1

당신은 어셈블러에 의지하지 않고이 작업을 최적화 할 수 있습니다

double doSomething(void) 
{ 
    return -5.0; 
} 
:

double doSomething(void) 
{ 
    double a = 1.0, b = 2.0, c = 3.0; 
    c = a * a - b * b; 
    b = c; 
    return a + b + c; 
} 

아니면 최적화 레벨을 설정 한 경우

+0

왜 하향 투표입니까? 의견이 없습니까? 이 질문에 대한 답변은 완벽합니다. –

+1

파이의 값을 소수점 이하 5 자리까지 계산하는 법을 배우고 싶다면 10 진수 또는 10 진수를 원할 때 새로운 답변을 얻으 려하지 않는 한 "3.14159"라고 대답하는 것이 지나치게 도움이되지 않습니다 장소. ... – Dinah

+0

@Dinah : 실제로 여기서 간과되는 심각한 점이 있습니다. 간과하기 쉬운 부분은 손으로 코딩 한 어셈블러와 같은 마이크로 최적화에 의지하기 전에 높은 수준에서 최적화해야한다는 것입니다. (항상 최후의 수단이어야 함). 또한, 원래 제기 된 질문은 세부 사항과 배경이 부족했기 때문에 질문자가 실제로하려고 한 것이 분명하지 않았습니다. 우리 사이의 유쾌한 유권자들은 종종 그러한 미묘한 점들을 놓치고 있습니다. –

2

컴파일러와 아키텍처에 완전히 의존합니다. 컴파일러를위한 인라인 asm에 대한 정보를 웹에서 찾아서 아키텍처에 대한 asm op 코드 (올바른 asm dialect - 컴파일러에 따라 다름)를 알아야합니다.

1

실제 포인트 학습 인라인 어셈블리가 없습니다. x64에서는 지원되지 않습니다 (즉, Visual Studio 사용). x64를 사용하든 사용하지 않든, 어느 시점에서 당신은 인라인 될 것이며 인라인 될 것입니다.

대신 MASM을 사용하는 방법을 배워보십시오. 여기서 MASM을 사용하는 방법을 배우면 x64에서 여전히 유용합니다.

+2

최근 요점은 무엇입니까? 나는 OP가 그들에 대해 알지 못했을 때를 대비해 당신이 더 나은 방법을 제시하는 것에 박수를 보냅니다. 그러나 "요점은 무엇입니까?" 나는 "포인트"를 염두에두고 프로그래밍을 시작하지도 않았다. 나는 그것이 재미 있고 재미 있었기 때문에 그것을했다. 대부분의 취미 프로그램에는 "요점"이 없으며, 내가하고 싶은 것입니다. 한 번 해봤 던 난해한 프로그래밍 언어를 만들었습니다. 요점은 무엇입니까? 내가 ~하는 것을 원하기 때문에. – Dinah

+0

Visual Studio에서 64 비트에 대해서는 인라인 어셈블리가 지원되지 않지만 어셈블리 자체는입니다. 기본적으로 C++에서 함수를 선언 한 다음 별도의 asm 파일에 asm 함수를 코딩하고 응용 프로그램을 빌드 할 때이를 링크합니다. 이것은 sé 당 "인라인"이 아니지만 동일한 일을하는 또 다른 방법 일뿐입니다. 그리고 그것은 중요합니다. 예를 들어, 32 비트 및 64 비트 버전의 VST 플러그인을 코딩 할 때 (또는 32 비트 VST 플러그인을 64 비트로 변환 할 때). 이 링크의 작동 방식을 보려면 다음 링크를 클릭하십시오. http://www.sciencezero.org/index.php?title=How_to_write_x64_assembly_functions_in_Visual_C%2B%2B –

0

최상의 옵션은 컴파일러에서 함수에 대한 어셈블리 언어를 인쇄하도록하는 것입니다. 이것을 인라인 어셈블리의 기준으로 사용하십시오.

일반적으로 인라인 어셈블리는 플랫폼에 따라 다르므로 특히 프로세서마다 다릅니다. 더 나은 해결책은 함수를 별도의 파일에 저장하는 것입니다. C 언어 버전 및 어셈블리 언어 버전을 만듭니다. 빌드 프로세스에서 다른 파일을 선택하십시오. 이를 통해 다른 플랫폼과 프로세서에 대해 다른 어셈블리 언어 버전을 사용할 수 있습니다 (나머지는 매우 중요 함).

관련 문제