2014-10-16 3 views
3

내가 nasm -f macho64 asm1.asm를 사용하는 나는 다음과 같은 오류 얻을 :Mach-O 64 비트 형식은 32 비트 절대 주소를 지원하지 않습니다. NASM

asm1.asm:14: error: Mach-O 64-bit format does not support 32-bit absolute addresses

asm1.asm

SECTION .data   ;initialized data 

msg: db "Hello world, this is assembly", 10, 0 

SECTION .text   ;asm code 

extern printf 
global _main 

_main: 
    push rbp 
    mov rbp, rsp 

    push msg 
    call printf 

    mov rsp, rbp 
    pop rbp 
    ret 

입니다 내가 어셈블리에 정말 새로 온 사람과 거의 이러한 명령이 무엇을 알고 있습니다. 뭐가 잘못 됐는지 알아?

+0

가능한 복제본 [x64 nasm : 메모리 주소를 스택 및 호출 기능에 푸시] (http://stackoverflow.com/questions/13091987/x64-nasm-pushing-memory-addresses-onto-the-stack-call) -function) –

+0

@MichaelFoukarakis,하지만 그 대답은 실제로'macho64'가 32 비트 절대 주소 지정을 허용하지 않는 이유를 설명하지 못합니다. 32 비트 절대 주소 지정은 elf64에서 정상적으로 작동합니다. –

+0

@MichaelFoukarakis, http://stackoverflow.com/questions/13091987/x64-nasm-pushing-memory-addresses-onto-the-stack-call-function/13092703?noredirect=1#comment41463350_13092703으로 답변을 이동했습니다. 이 질문은 이제 중복되었습니다. –

답변

3

다른 UNIX/POSIX 시스템과 마찬가지로 Mac OS X은 64 비트 코드에 대해 다른 호출 규칙을 사용합니다. 모든 인수를 스택에 푸는 대신 처음 6 개의 인수에 대해 RDI, RSI, RDX, RCX, R8R9을 사용합니다. 따라서 push msg을 사용하는 대신 mov RDI, msg과 같은 것을 사용해야합니다.

+0

Mac Dev Library의 관련 [section] (https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/LowLevelABI/140-x86-64_Function_Calling_Conventions/x86_64.html) 및 [ 업데이트 된 ABI] (http://x86-64.org/documentation/abi.pdf). –

+0

교육용으로 원래 프로그램의 실제 버전을 보여줄 수 있습니까? – akst

0

Drew McGowen이 지적한 것 외에도 rax은 0으로 설정해야합니다 (벡터 매개 변수 없음).

그러나 -f win64 또는 -f elf64이이 코드에서 작동합니다. 나는 -f macho64에있는 버그를 의심합니다 (그러나 나는 무엇을 macho64이 "해야"하는지 모르겠습니다). 이 문제가 해결 될 때까지 (?) default rel 또는 mov rdi, rel msg을 사용하는 것이 좋습니다. 내가 "생각"은 나중에 작동합니다.

+0

이것은 NASM 버그가 아니며, 'push'는 [documentation] (http://www.intel.com/content/dam/www/public/us/en/documents/)에 따라 64 비트 즉석 값을 지원하지 않습니다. manuals/64-ia-32-architectures-software-developer-manual-325462.pdf). –

+0

사실 충분하지만, Nasm이 32 비트 주소라고 생각하는 이유는 무엇입니까? –

+0

이것은 버그가 아니며 32 비트 절대 주소 지정을 지원하지 않습니다. 이미지베이스는 OS X에서 기본적으로 2^32보다 큽니다. 내 대답을보십시오. –

관련 문제