2014-12-31 2 views
1

저는 Jeff Duntemann의 책 : Step by Step Assembly를 공부하고 있습니다. 여기에 제공되는 소스 코드는 다음과 같습니다Ubuntu에서 0xe, kdbg의 메모리에 액세스 할 수 없습니다.

SECTION .data   ; Section containing initialised data 

    EatMsg: db "Eat at Joe's!",10 
    EatLen: equ $-EatMsg  

SECTION .bss   ; Section containing uninitialized data 

SECTION .text   ; Section containing code 

global _start   ; Linker needs this to find the entry point! 

_start: 
    nop   ; This no-op keeps gdb happy... 
    mov eax,4  ; Specify sys_write call 
    mov ebx,1  ; Specify File Descriptor 1: Standard Output 
    mov ecx,EatMsg  ; Pass offset of the message 
    mov edx,EatLen  ; Pass the length of the message 
    int 80H   ; Make kernel call 

    MOV eax,1  ; Code for Exit Syscall 
    mov ebx,0  ; Return a code of zero 
    int 80H   ; Make kernel call 

내가 가지고있는 우분투 12.04 64 비트 맥 OS 요세미티의 상단에 VirtualBoxVM에서 실행되는 32 비트.

나는 호출 오전 :

kdbg eatsyscall 

이 KDBG를 시작합니다. 내가 볼 EatMsg에 대한 KDBG를 사용하여 코드를 실행하면 EatMsgEatLen

: 544,497,989을하지만 EatLen 위해 내가 볼 : 는 메모리를 액세스 할 수 에서

나는이 표현이 부분을 시계

이 544,497,989 V 무엇인가 0XE

에 나는이 개 질문이 alue와 EatLen에 대해 "Can not Access"메시지가 나타나는 이유는 무엇입니까?

답변

3

544497989EatMsg의 주소입니다. 이는 단지 메모리 위치 즉, 거대한 숫자입니다. EatMsg의 모든 바이트 후 다음 위치 "이 시점에서 주소"를 의미 $ : 당신이 C 또는 C++를 알고 있다면 당신의 선언이 char * eatMsg = "Eat at Joe's!";

EatLenEatMsg의 길이 있다면, 그것은 &eatMsg에 해당합니다. 따라서 $-EatMsg은 "EatMsg의 시작 주소 - 시작 부분이 EatMsg 인 모든 바이트 이후의 주소"= "길이가 EatMsg"= 14 진수 = 0x0E 16 진수입니다.

디버거가이 길이를 주소로 해석 할 가능성이 높습니다. 이들과 같은 작은 값은 주소로 참조 될 수 없습니다. 이 값을 단지 값으로 표시해야하며, 해석은 주소가 아닙니다.

+0

그러나 544497989는 2의 거듭 제곱이 아닙니다. 주소의 거듭 제곱은 2가 아니면 안됩니까? –

+0

아니요. 어떤 데이터와 아키텍쳐에서는 2 * (또는 4, 또는 8)의 a * 배수가 필요하지만 db의 경우에는 그렇지 않습니다. – geert3

+1

실제로, 544497989 (십진수)는 16 진수로 표현됩니다. 20746145h - 공간에 대한 ASCII 코드 't', 'a', 'E'- 멀티 바이트 값이 "little-endian"으로 저장되기 때문에 "거꾸로"나타납니다. 한 번에 한 바이트 씩 검사하면 "올바른"순서로 나타납니다. –

관련 문제