저는 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를 사용하여 코드를 실행하면 EatMsg 및 EatLen
: 544,497,989을하지만 EatLen 위해 내가 볼 : 는 메모리를 액세스 할 수 에서
나는이 표현이 부분을 시계
이 544,497,989 V 무엇인가 0XE
에 나는이 개 질문이 alue와 EatLen에 대해 "Can not Access"메시지가 나타나는 이유는 무엇입니까?
그러나 544497989는 2의 거듭 제곱이 아닙니다. 주소의 거듭 제곱은 2가 아니면 안됩니까? –
아니요. 어떤 데이터와 아키텍쳐에서는 2 * (또는 4, 또는 8)의 a * 배수가 필요하지만 db의 경우에는 그렇지 않습니다. – geert3
실제로, 544497989 (십진수)는 16 진수로 표현됩니다. 20746145h - 공간에 대한 ASCII 코드 't', 'a', 'E'- 멀티 바이트 값이 "little-endian"으로 저장되기 때문에 "거꾸로"나타납니다. 한 번에 한 바이트 씩 검사하면 "올바른"순서로 나타납니다. –