2012-02-20 3 views
2

.long 문에서 데이터를 검색하려면 어떻게해야합니까? 예 :데이터 검색 중 x86_64

.data 
data_items: 
    .long 3,67,34,222,45,75,54,34,44,33,22,11,66,0 

.text 

.globl _main 
    _main: 
     movl $0, %edi 
     movl data_items(,%edi,4), %eax 

절대가 x86_64에 허용되지 않는 어드레싱에 대한 오차의 큰 계열을 준다. 이 데이터에 어떻게 액세스 할 수 있습니까? 나는 조립이 새롭기 때문에 용어가 혼란 스럽다면 사과드립니다.

편집 : 나는

+0

어떤 어셈블러를 사용하고 있습니까? – Crashworks

+0

GNU 어셈블러/GCC – Jumhyn

답변

5

문제는 데이터가 데이터 세그먼트에 당신의 코드는 텍스트 세그먼트에 있다는 것이다 GNU 어셈블러/GCC를 사용하고 있습니다. 링커는 재배치 가능한 코드를 요구하도록 설정되어 있습니다. 즉, 런타임까지 절대 주소를 알 수 없으므로 절대 주소를 사용할 수 없습니다.

변동 가능 코드를 사용하려면 명령어 포인터 rip에서 오프셋으로 data_items에 액세스해야합니다.

_main: 
    movl $0, %edi 
    leaq data_items(%rip), %rax 
    movl (%rax,%rdi,4), %eax 

leaq 명령어 링크 타임에 계산 될 수 인스트럭션 포인터의 오프셋을 사용 data_items의 주소를 얻는다. 그런 다음 movl 명령어는 데이터를로드하기위한 기본 주소로 해당 주소를 사용합니다. 주소 지정에 rdi을 사용했음을 유의하십시오. edi에 쓸 때 의 상위 32 비트는 자동으로 지워 지므로 edi의 값이 부호없는 한 수정되지 않고 그대로 작동합니다. edieax을 사용할 수 있지만 32 비트를 초과하는 주소는 잘라 버릴 수 있으며 기본 주소 크기가 64 비트이므로 컴파일 된 코드가 더 커집니다.

+0

완벽하게 작동했습니다. 감사합니다! – Jumhyn