2017-11-15 6 views
2

에 액세스하면 명령을 사용하여, 내 Mac 컴퓨터 끄기이 코드를 실행 :Mach-O 64 비트 형식은 32 비트 절대 주소를 지원하지 않습니다. NASM은 배열

nasm -f macho64 -o max.a maximum.asm 

이 내가 배열 내에서 가장 많은 수를 찾아 내 컴퓨터에서 실행을 시도하고있는 코드입니다.

section .data 

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

    section .text 

global _start 

_start: 
    mov edi, 0 
    mov eax, [data_items + edi*4] 
    mov ebx, eax 

start_loop: 
    cmp eax, 0 
    je loop_exit 
    inc edi 
    mov eax, [data_items + edi*4] 
    cmp eax, ebx 
    jle start_loop 

mov ebx, eax 
jmp start_loop 

loop_exit: 

mov eax, 1 
int 0x80 

에러 : 올바른지

maximum.asm:14: error: Mach-O 64-bit format does not support 32-bit absolute addresses 
maximum.asm:21: error: Mach-O 64-bit format does not support 32-bit absolute addresses 
+1

먼저 질문해야합니다. 32 비트 프로그램이나 64 비트 프로그램을 만들려고합니까? –

답변

4

는, OS X 64 비트 코드 어드레스 절대 사용할 수 및 위치에 독립적이어야한다.

위치 독립적 인 방법으로 주소를 레지스터에 가져 오려면 RIP 기준 lea rsi, [rel data_items]을 사용하십시오. (RIP- 상대도 인덱스를 사용할 수 없습니다.) 귀하의 경우, 인덱스를 사용하는 대신 포인터를 4 씩 증가시킬 수 있으므로 루프 내부에서 추가 지시가 들지 않습니다.

파일 상단에 default rel을 사용하면 [rel foo]을 작성하지 않아도됩니다.

그리고 BTW는 64 비트 코드에서 64 비트 주소 지정 모드를 사용하는 것이 좋습니다. 예 : [esi + edi*4]이 아니라 [rsi + rdi*4]을 사용하십시오. 일반적으로 32 비트 포인터를 자르지 않으려 고 인코딩하려면 추가 주소 크기 프리픽스가 필요합니다.

마찬가지로, int 0x80이 아닌 64 비트 시스템 호출을하려면 syscall을 사용해야합니다. What are the calling conventions for UNIX & Linux system calls on i386 and x86-64.

+0

업데이트, 분명히 OS X는 PIE (위치 독립적 실행 파일)가 필요하지 않으며 32 비트 이상의 이미지베이스 만 사용합니다. 그래서 당신은 * mov r64, imm64를 사용하여 주소를 레지스터에 넣을 수 있지만, RIP- 상대 LEA가 더 좋기 때문에 그렇게하지 마십시오. –

관련 문제