2015-01-08 1 views
1

입니다 소스 코드 내가 가진 :왜 메모리에 저장된 데이터가 반대로되어 있습니까?

section .data   
msg: db "pppaaa"  
len: equ $ 
section .text   
    global main  
main:      
    mov  edx,len 
    mov  ecx,msg 
    mov  ebx,1 
    mov  eax,4 
    int  0x80 

을 그리고 나는이 코드를 디버깅 할 때 나는 볼 수 있습니다 :

(gdb) info register ecx 
ecx   0x804a010  134520848 
(gdb) x 0x804a010 
0x804a010 <msg>:  0x61707070 
(gdb) x 0x804a014 
0x804a014:  0x00006161 

"70"여기에 문자 'P'와 '61'문자를 나타냅니다 분명히.

내가 혼란스러워하는 이유는 0x804a010 위치의 데이터가 0x61707070 (appp)이고 0x804a014에서 4 바이트 앞으로 이동한다는 것입니다. 데이터는 --aa입니까?

첫 번째 위치는 (pppa), 두 번째 위치는 (aa--)가 표시됩니다. 왜 이런 경우입니까?

+2

리틀 엔디안 환경에서 작업 할 가능성이 큽니다. 바이트는 "다른 방법으로"저장됩니다. [참조하십시오] (http://en.wikipedia.org/wiki/Endianness) – lared

+1

@lared 하이 엔디안으로 전환하려면 어떻게해야합니까? –

+3

@KorayTugay : 당신은하지 않습니다 (대부분의 아키텍처는 불가능하며 모든 프로그램이 중단 될 수 있습니다). 당신이하는 일은 32 비트 뷰에서 바이트 배열을 보는 것입니다. 데이터를 일치 시키려면 바이트 중심의보기를 사용하십시오. "위치 0x804a010의 데이터가 0x61707070입니다."라고 말했을 때 실제로 잘못되었습니다. 실제로 위치 0x804a010의 데이터는 0x70입니다. –

답변

2

GDB는 당신이 숯을 가지고 있다는 것을 모릅니다. 당신은 메모리 위치를 보도록 요청하고 있고, 거기에 무엇이 있는지 표시하고 있으며, 기본값은 4 바이트 정수입니다. 정수가 최하위 바이트 먼저 저장되었다고 가정합니다. 인텔에서 수행되는 방식이기 때문에 바이트를 반대로 가져옵니다.

이 문제를 해결하려면 다음과 같이 당신의 x 명령으로 형식 지정자를 사용

x/10c 0x804a010 

이 (0x804a010에서 시작 (10 개) 문자를 출력 할 것이다).

help x은 GDB에서 더 많은 정보를 제공합니다.

+0

우리는 실제로 바이트가 역순으로 저장되지 않는다고 말할 수 있지만, gdb는 정수를보고 있기 때문에 나를 보여줍니다? –

+0

@KorayTugay, 네, 그건 제 이해입니다. – Tony

+0

@lared Lared,이 평균 바이트는 실제로 "다른 방법으로"저장되지 않지만 gdb의 표현 일 뿐입니 까? –

관련 문제