2015-02-06 3 views
1
0x08048c62 <+0>:  sub $0x2c,%esp 
    0x08048c65 <+3>:  lea 0x1c(%esp),%eax 
    0x08048c69 <+7>:  mov %eax,0xc(%esp) 
    0x08048c6d <+11>: lea 0x18(%esp),%eax 
    0x08048c71 <+15>: mov %eax,0x8(%esp) 
    0x08048c75 <+19>: movl $0x804a73d,0x4(%esp) 
    0x08048c7d <+27>: mov 0x30(%esp),%eax 
    0x08048c81 <+31>: mov %eax,(%esp) 
    0x08048c84 <+34>: call 0x80488d0 <[email protected]> 
=> 0x08048c89 <+39>: cmp $0x1,%eax 

마지막 명령에서 $0x1의 내용을 어떻게 인쇄합니까? 주소 0x1로 메모리를 액세스 할 수 없습니다, 또는 값 나는 C, S, X로 유형을 변경하려고하는 경우에도 (정수로 변환 할 수 없습니다, A : 나는 모든 조합 gdb : ASM의 메모리 주소에 값을 인쇄하는 방법

x/d 0x1 
x/d $0x1 
x/s $0x1 
... 
... 

하지만 하나가 오류가 시도)

궁극적으로 내가 즉, scanf에 전달되는 인수를 찾기 위해 노력하고있어 "% d 개 % d 개 % C"

답변

4

즉시 값이입니다 $1, 그것은 단지 숫자 1입니다. 주소가 아닙니다. 처리 된 항목 수인 sscanf의 반환 값을 확인하고 있습니다. 물론 변환 된 값은 인수로 sscanf에 전달 된 포인터의 메모리에 배치됩니다.

예를 들어, 형식 문자열은 0x804a73d이고, x/s 0x804a73d을 사용하여 인쇄 할 수 있어야합니다.

효율상의 이유로 코드에 mov을 사용하면 push 대신 스택에 항목을 넣습니다. 스택의 적절한 오프셋에서 인수를 볼 수 있습니다. 그들은 (%esp)에서 시작하여 각각 4 바이트 :

첫번째 인수 (에서 읽을 수있는 문자열) :

0x08048c7d <+27>: mov 0x30(%esp),%eax 
    0x08048c81 <+31>: mov %eax,(%esp) 

2 인자 (형식 문자열) :

0x08048c75 <+19>: movl $0x804a73d,0x4(%esp) 

3 인수 (1 출력 포인터) :

0x08048c6d <+11>: lea 0x18(%esp),%eax 
    0x08048c71 <+15>: mov %eax,0x8(%esp) 

네 번째 인수 (두 번째 출력 포인터) :

0x08048c65 <+3>:  lea 0x1c(%esp),%eax 
    0x08048c69 <+7>:  mov %eax,0xc(%esp) 
+0

이제는 내 질문이 있습니다. 푸시 지침이 표시되지 않을 때 scanf에 인수로 전달되는 내용을 어떻게 알 수 있습니까? – SSOPLIF

+0

@filposs는'(% esp)','4 (% esp)'등과 같은 메모리 주소를''mov ''찾는다. 이것은''push '와 유사하지만 매번'% esp'를 감할 필요가 없다. . –

+0

거기에 있다는 것을 알면서도 전혀 문제가없는 것처럼 보였습니다! 이것을 결정하는 통찰력있는 방법을 내게 설명해 주시겠습니까? 모든 mov 지침 중, 어떻게 알 수 있습니까? (% d % d) – SSOPLIF