을 작성하고 이해하는 방법과 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.
와우. 그것은 놀라운 대답이었습니다! 그 중 일부는 이미 알고 있었지만이 수준의 세부 정보는 매우 높이 평가됩니다. 내가 찾고 있던 대답은 Jagged O'Neill이 올린 내용 이었지만,이 대답을 받아들이지 못한다는 것을 인정합니다. (적어도 +1 할 수 있습니다.) – BlackVegetable
죄송합니다 귀하의 질문을 의도대로 이해하지 못했습니다. –
문제 없습니다. 이 답변은 수년 동안 나 자신과 다른 많은 사람들에게 매우 유용하다는 것을 알 수 있습니다. – BlackVegetable