2012-01-22 2 views
2

gdb를 사용하여 프로그램을 검사하고 있습니다. 어셈블리 코드는하고있다 : 나는 %eax의 내용을 검사 할 때 x86 cmp 연산 코드, 포인터 및 인라인 문 숫자

cmp $0x5, %eax 

그러나, 내가 얻을 : \020\343\377\377\377\177 문자열로 조사 할 때.

\020\343\377\377\377\177은 조립시 $ 0x5와 비교하면 어떻습니까?

+2

"% eax의 내용"이란 무엇입니까? 문자열로 검사 되었습니까? 레지스터는 C 의미에서 의미있는 문자열을 가질 수 없습니다. –

+3

꽤 넓은 eax가 있습니다. –

+0

x/30s $ eax – darksky

답변

2

cmpeax의 값을 5과 비교합니다. eax이 가리키는 값은 포인터라고 생각하면 상수와 전혀 비교되지 않습니다. eax의 값에서 감산되고 5 수단 귀하의 경우에, 여러 플래그 (CF는 OF, SF는, ZF는 AF 및 PF는 documentation에 따른) 설정 -

는 비교를 감산함으로써 행해진 다 적절하게. 일반적으로 cmp 명령어 다음에 일종의 조건 명령어 (종종 점프)가 뒤 따르어 비교 결과에 따라 다른 동작을 수행합니다.

eax을 포인터로 해석하지 않고 eax으로 알려 주면 더 많은 정보를 제공 할 수 있습니다. p $eax 또는 info registers을 사용하여 012db의 값을 gdb에 얻을 수 있습니다.

+0

p'$ eax'를 실행하면 6307568이됩니다. 유감 스럽지만'x/30s $ eax'와'p $ eax'의 차이점은 무엇입니까? – darksky

+0

'p $ eax'는'eax'의 값을 보여줍니다. 'x/30s $ eax'는'eax'를 포인터로 사용하고, 역 참조하고, 결과를 문자열로 보여줍니다. 'x'와'p'에 대한 gdb 문서를 확인하십시오. –

+0

사람들의 추후 참조를 위해 다음과 같이'xdb - FMT ADDRESS','p - 표현식 EXP의 값을 출력 '등의'gdb apropos'가있다. – Will