2014-10-02 1 views
1

그래서이 쉬운 프로그램에서는 012db에 액세스하려고합니다.(Assembly newbie) GDB에서 x86-64의 32 비트 레지스터에 액세스 할 수 없습니다

C 코드 : 여기

int main(){ 
    int a = 1; 
    int b = 3; 
    int c = a + b; 
    return 1; 
} 

내 gdb를 시도하다 :

그래서
(gdb) disas 
Dump of assembler code for function main: 
0x000000000040049c <+0>: push %rbp 
0x000000000040049d <+1>: mov %rsp,%rbp 
0x00000000004004a0 <+4>: movl $0x1,-0x4(%rbp) 
0x00000000004004a7 <+11>: movl $0x3,-0x8(%rbp) 
0x00000000004004ae <+18>: mov -0x8(%rbp),%eax 
0x00000000004004b1 <+21>: mov -0x4(%rbp),%edx 
=> 0x00000000004004b4 <+24>: add %edx,%eax 
0x00000000004004b6 <+26>: mov %eax,-0xc(%rbp) 
0x00000000004004b9 <+29>: pop %rbp 
0x00000000004004ba <+30>: retq 
End of assembler dump. 

(gdb) x $rbp 
0x7fffffffe620: 0x00000000 
(gdb) x $rbp-4 
0x7fffffffe61c: 0x00000001 
(gdb) x $rbp-8 
0x7fffffffe618: 0x00000003 
(gdb) x $eax 
0x3: Cannot access memory at address 0x3 

당신은 내가 rbp에 액세스 할 수 x $rbp를 사용하여 아무 문제가 없지만, 내가 eax에 액세스 할 수 없습니다 해요 볼 수 있습니다 .

64 비트 시스템에서 gdb의 32 비트 레지스터에 액세스하려면 몇 가지 설정이 필요합니까?

+2

대신에'p $ rbp'와'p $ eax'를 시도해보십시오. (그리고 "help x"와 "help p"를 사용하면이 두 명령의 차이점을 알 수 있습니다) – Nemo

답변

3

x 명령은 examine을 나타냅니다. 그것은 포인터를 입력으로 받아들이고 거기에있는 것을 보여줍니다. print 명령을 찾고, 또는 인수 값을 인쇄하는 p 명령을 찾고 있습니다.

p $eax 

x $rbp을 수행하면 실제로 무엇이 스택에 있는지 살펴볼 수 있습니다. 귀하의 예에서는 에 주소가 0x7fffffffe620으로 표시됩니다.

의 오류 메시지는 eax의 값이 3임을 나타내며 올바른 포인터가 아니기 때문에 대신 오류 메시지가 표시됩니다.

+0

응답 해 주셔서 감사합니다. 그래서 x가 포인터를 입력으로 받아들이면 'x $ eax'와 'x $ rax'를 입력 할 때 어떤 차이가 발생합니까? $ rax에 액세스 할 수는 있지만 $ eax에 액세스 할 수 없으며 포인터 나 포인터가 아닌 포인터라고 가정합니다. – user49404

+0

당신은'$ rax'을 보여주지 않았지만,'$ rax'의 상위 비트가 유효한 포인터로 간주하는 반면 낮은 비트는 그 자체로는 유용하지 않다고 가정합니다. 'x $ eax'를 실행하면 주소의 상반부를 폐기합니다 (주소라고 가정). – zneak

+0

즉, 'eax'는'rax'의 하위 32 비트이기 때문에'eax'가'rax'라는 근거로 유효한 포인터라고 가정 할 수 없습니다. 그것은 포인터 크기의 절반입니다. 좀 더 명확한 예를 들면,'al'은'rax'의 하위 8 비트이지만 여러분은 (아마도) 그것을 포인터라고 생각하지 않을 것입니다. – zneak

-1

chutiye ... 마이너스 플러스 마이너스 값이 무엇인지 .. 당신이 메모리에 추가 할 필요가 많은 비트 ....

** 0x000000000040049d < 1> : mov 인 %의 RSP %의 RBP

0x00000000004004a0 < 4>의 movl의 $ 0x1을 -0x4 (%의 RBP)

0x00000000004004a7 < 11>의 movl의 $의 0x3으로, 오류는 다음 메모리 명령 - 0x8이 직접 문자열을 추가하지 못할 왜냐하면 여기 (% rbp) **

+0

메모리의 문자열 값을 8 비트로 곱하려고합니다 .... – ciph3r

+0

일반 AT & T 구문의 최적화되지 않은 컴파일러 출력이 'gcc -O0'에서 저에게 보입니다. 사용자가 제시 한 지침에는 문자열이나 추가 사항이 없습니다. –