2016-11-02 2 views
1

어셈블리에서 조건부 코드를 이해하는 데 어려움을 겪고 있습니다. 오른쪽의 어셈블리는 왼쪽의 funA()에 대한 것이지만 어셈블리의 3-4 행에는 문제가 있습니다.조건부 플래그 어셈블리 - cmp, 테스트

cmp rax, rcx // a[idx] <= *b 

그러나 코드에서 문이 정반대 실제 인 경우

여기에 내 생각 과정이다. 어셈블리와 어떻게 관련이 있는지 알고 있습니다. 조건부 실행은 역순 ... 따라서 대신 [idx]> * b가됩니다. "jle"과 관련이 있습니까? 누군가 나 한테 이걸 설명해 주겠니? 그것은 먼저 else 코드를 삽입, 그리고 상태를 반전 - enter image description here

+0

어떻게 C#과 관련이 있습니까? – fuz

+0

그는 단지 Jon Skeet의 주목을 받고 싶었습니다. D – Jester

답변

2

당신이 .L1과 .L2 보면

enter image description here

는 JIT 컴파일러는 순서를 반대로하기로 결정했다. jle은 "작거나 같으면 점프"하므로 C#과 동일 해집니다.

if (a[idx] <= *b) 
{ 
    *b = *b + *b; 
} 
else 
{ 
    *b = a[idx]; 
} 
+0

감사합니다! 그렇게 쓰면 훨씬 더 의미가 있습니다. 다음 번에 그렇게 할 것이므로 혼자서 혼동하지 않을 것입니다. – helloworld

관련 문제