2012-09-12 1 views
2

을 작성하고 이해하는 방법과 GDB 및 관련 도구를 효과적으로 사용하는 방법을 배우려고합니다. 이렇게하려면 GDB의 프런트 엔드에 DDD을 프런트 엔드로 사용하고 있습니다.DDD에서 eFlags 해석

조건 플래그 (eflags?)가 모두 주어져 동일한 레지스터에 저장되는 것으로 보이는 것을 이해하는 데 문제가 있습니다. 나는 레지스터, 어셈블리 코드 및 관련 C 코드를 게시 할 것이다. 도움을 주셔서 감사합니다.

레지스터는 주어진 중단 점에서 다음과 같이 표시됩니다 0x293 [CF AF SF IF]

다음은 C 코드 실행되고있다. (이건 내 코딩 스타일의 예가 아니다 나는 compl 작업을 사용하는 GCC를 강제하려합니다..)

int main(int argc, char* argv[]) 
{ 
    int a = 0; 
    int b = 2; 
    if(a == b) // There is a breakpoint here! 
    goto EQUAL; 
    else 
    goto NEQUAL; 

    EQUAL: 
    return 3; 

    NEQUAL: 
    return 1; 
} 

다음 내 컴퓨터는로를 고장 어셈블리입니다 :

Dump of assembler code for function main: 
0x0000000000400474 <+0>:  push %rbp 
0x0000000000400475 <+1>:  mov %rsp,%rbp 
0x0000000000400478 <+4>:  mov %edi,-0x14(%rbp) 
0x000000000040047b <+7>:  mov %rsi,-0x20(%rbp) 
0x000000000040047f <+11>: movl $0x0,-0x8(%rbp) 
0x0000000000400486 <+18>: movl $0x2,-0x4(%rbp) 
0x000000000040048d <+25>: mov -0x8(%rbp),%eax 
0x0000000000400490 <+28>: cmp -0x4(%rbp),%eax 
0x0000000000400493 <+31>: jne 0x40049d <main+41> # Break point here 
0x0000000000400495 <+33>: nop 
0x0000000000400496 <+34>: mov $0x3,%eax 
0x000000000040049b <+39>: jmp 0x4004a3 <main+47> 
0x000000000040049d <+41>: nop 
0x000000000040049e <+42>: mov $0x1,%eax 
0x00000000004004a3 <+47>: leaveq 
0x00000000004004a4 <+48>: retq 
End of assembler dump. 

답변

3

eflags 레지스터는 단일 비트로 구성되며 각 비트는 플래그입니다.

플래그를 표시 할 때 더 큰 숫자 엔티티 (예 : 0x293)와 결합하거나 각각의 심볼을 가질 수 있습니다 (예 : "[CF AF SF IF]"와 같이 carry 플래그 사용). CF는, 플래그 AF를 조정 플래그 SF에 서명하고 IF 플래그를 중단

Intel 64 and IA 32 Architecture Software Developer's Manual Vol. 1 장 3.4.3에 자세히 플래그를 설명

(응용 프로그램 개발자를위한) 가장 중요하다..

 
bit | sym | name 
------------------ 
    0 | CF | carry 
    1 | -- | (always 1) 
    2 | PF | parity 
    3 | -- | (always 0) 
    4 | AF | adjust 
    5 | -- | (always 0) 
    6 | ZF | zero 
    7 | SF | sign 
    8 | TF | trap 
    9 | IF | interrupt 
10 | DF | direction 
11 | OF | overflow 

귀하의 예를 결합하십시오 (CF AF SF IF) 가장 오른쪽 숫자가 캐리 플래그이고 가장 왼쪽이 인터럽트 플래그 인 이진 값 1010010011을 제공합니다. 16 진수로 변환하면 정확히 0x293이됩니다.

2

(R/E)FLAGS 레지스터는 다음과 같은 상태 플래그를 포함 (오버 플로우 플래그) OF

을 - 서명 피연산자에 대한 정수 산술 연산 (예를 들어 ADD, ADC, SUB, SBB 지시)의 오버 플로우를 결정하는 데 사용된다. 조건부 분기/점프 (Jcc 명령어)는이 플래그를 직접 검사 할 수 있습니다.

(기호 플래그) SF - 마지막 정수 연산의 결과가 음의 값인지 여부를 결정하는 데 사용은, SF은 기본적으로 부호 비트 (= 최상위 비트)의 사본입니다 결과. 다시 말하지만, 조건부 분기/점프는이를 직접 검사 할 수 있습니다.

ZF (제로 플래그) - 마지막 정수 연산 또는 논리 연산의 결과가 0인지 아닌지를 결정하는 데 사용됩니다. 조건 분기/점프는 직접 조건부 분기/점프를 검사 할 수 있습니다.

CF (캐리 플래그) - 마찬가지로, 오버 플로우 플래그 ( OF )하는 것이 정수 산술 연산의 오버 플로우를 결정하는 데 사용될 수는 부호 피연산자에 대해 수행 하였다.차이점을 확인하십시오. CF (서명되지 않음), OF (서명 됨). 또한 CPU가 을 계산하는 경우가 있으며 올바른 플래그를 검사하는 것은 프로그래머의 책임입니다. 대부분의 경우 CPU는 결과가 동일한 방식으로 계산되고 CPU에 대한 모든 데이터이기 때문에 부호있는 연산자와 부호없는 연산자를 구분할 수 없으며 구분할 수 없습니다. CPU가 아닌 부호 또는 부호없는 값을 해석하는 것은 프로그래머의 책임입니다. 조건 분기/점프는 CF을 직접 검사 할 수 있습니다.

편집 : CF를 사용 rotate through carry 지침 (RCLRCR는)도 있습니다.

정수 비교 (CMP 명령어 사용) 결과 위의 네 플래그가 설정됩니다. 부호없는 정수를 비교하려는 경우 ZF 및/또는 을 검사하십시오. 부호있는 정수 비교의 경우 ZF 및/또는 SF + 쌍을 검사해야합니다. 조건 분기/점프 지침 (Jcc : JB, JNC, JE, JNGE 등)을 참조하십시오.

패리티 플래그, PF 및 보조 캐리 플래그, AF, 다른 조건 플래그,하지만 그들은 거의 사용되지 않습니다.

(R/E)FLAGS의 나머지 비트는 시스템 또는 제어 플래그입니다. 그 중 두 가지를 알고 싶을 것입니다 :

DF (방향 플래그) - 문자열 명령의 방향을 설정하는 데 사용됩니다. 문자열 명령어는 블록 메모리 복사, 블록 메모리 비교, 블록 메모리 검색, 블록 메모리 채우기 등과 같은 작업을 위해 메모리를 순차적으로 액세스하는 데 사용됩니다 (MOVSB/W/D/Q, CMPSB/W/D/Q, SCASB/W/D/Q, STOSB/W/D/Q, LODSB/W/D/Q 참조). 이 플래그의 값은 각 반복 후에 메모리 피연산자 주소가 증가 또는 감소되어야하는지 여부를 알려줍니다.

IF (인터럽트 플래그) - 하드웨어 인터럽트 처리를 활성화 또는 비활성화하는 데 사용됩니다. 매우 낮은 수준의 프로그래밍 (드라이버, OS 커널 등)에 빠지면이 플래그로 작업해야합니다.

그게 전부입니다. 모든 세부 사항은 Intel 및 AMD의 공식 CPU 문서에서 볼 수 있습니다. CPU 매뉴얼을 다운로드하십시오.

: 1, 2과 같은 질문/답변이 유용 할 수 있습니다.또한

알고 유용

은 다음과 같습니다

  • 모든 지침 수정 조건 플래그
  • 일부 항상을 수정하고 0으로 설정 또는 1
  • 일부가 지정되지 않은 값으로 설정하고 당신은 할 수 없습니다 0 또는 1을 의지하거나 기대하십시오.
+0

와우. 그것은 놀라운 대답이었습니다! 그 중 일부는 이미 알고 있었지만이 수준의 세부 정보는 매우 높이 평가됩니다. 내가 찾고 있던 대답은 Jagged O'Neill이 올린 내용 이었지만,이 대답을 받아들이지 못한다는 것을 인정합니다. (적어도 +1 할 수 있습니다.) – BlackVegetable

+0

죄송합니다 귀하의 질문을 의도대로 이해하지 못했습니다. –

+0

문제 없습니다. 이 답변은 수년 동안 나 자신과 다른 많은 사람들에게 매우 유용하다는 것을 알 수 있습니다. – BlackVegetable