2017-11-15 2 views
2

にアクセスすると、コマンドを使用して、私のMacコンピュータをオフこのコードを実行:Mach-Oの64ビットフォーマットは、32ビットの絶対アドレスをサポートしていません。 NASMは、Array

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ではなく、syscallを使用して64ビットシステムコールを行う必要があります。 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が優れているのでできません。 –

関連する問題