2014-12-29 3 views
1

를 계산하기 위해 GCC 어셈블리 지침을 이해하는 I가 다음 코드를조건부 점프

if((a<0) || (a>global_count)) //global_count is a global int 
{ 
    print error; 
} 

normal_flow 
    ... 

지금 여기 GCC가 생성하는 어셈블러입니다 :

cmpl 0x0 , 0x10(%ebp) //first check 
js print_error 
mov 0x8(%ebp) , %eax 
mov 0x8(%eax) , %eax 
cmp 0x10(%ebp) , %eax //second check 
jge normal_flow 
print_error 

나는 왜 jge 이해가 안가? 나는 그것이 movl 대신에 mov를 사용하고있는 것을 본다. 그러나 나는 그것이 jle이 경우이거나 jg이어야한다고 생각한다. 우리가 점프 대상을 바꾸면 ... 아니면 내가 여기서 잘못 생각하고 있는가?

답변

3

컴파일러가 피연산자와 조건을 모두 바꿔서 jge입니다. global_count >= a을하고 있습니다. 0x10(%ebp)a이고 %eaxglobal_count입니다. 더 복잡한 문제가 발생하면 &에 구문 자체에 피연산자가 반대로 나타납니다.

+0

물론, 이해할 수 있습니다 :'cmp src, dest' src (a)가 dest (global_count)보다 크거나 같으면 점프, 맞습니까? 그것이 제가 처음으로 비교 한 것에서 제가 이해하는 것입니다. – Achilles

+1

잘못되었습니다. 비교의 의미는'dest op src'입니다. 첫 번째 경우에도'if (a-0 <0)'('cmp'는 변장의'sub')입니다. – Jester

관련 문제