私はGNUアセンブリで配列を扱おうとしています。私の意見では、次のコードでは、値3で終了しなければなりません。しかし、それは私の意見movw inArr(%rip, %rcx, 2), %di
コマンドでは13AT&T GASアセンブリの配列アドレス指定。 RIPからのレジスタのオフセットが機能しません
.section __DATA,__data
inArr:
.word 13, 2, 3, 4, 5, 6, 7, 8, 9, 10
outArr:
.fill 10, 2
.section __TEXT,__text
.globl _main
_main:
movq $3, %rcx
movw inArr(%rip, %rcx, 2), %di # load *((rcx * 2)+ rip + &inArray) into %di, isn't it?
movl $0x2000001, %eax # exit
syscall
で終了%di = inArr[%rcx]
のようなものと同じです。残念ながら、私はGASでarrayを使った例は見つけられません。
このコードで何が問題になっていますか?そして配列のn番目の要素をどのように扱いますか?
あなたは位置独立コードを必要としない場合は、 'movzwlのinArr(、%のRCX、2)、%のedi'を使用することができます。しかし、あなたはおそらく* OS XのPICが必要です* –
ありがとう! これは、「エラー:32ビット絶対アドレス指定は64ビットモードではサポートされていません」というエラーを表示します。 OS X用のPICが見つかりません。これを明確にすることはできますか? –
PIC =位置に依存しないコード。 OS Xの絶対アドレス指定は、OS Xのx86-64コードではまったく使用できません。 ([Linuxとは異なります](https://stackoverflow.com/questions/43367427/32-bit-absolute-addresses-no-longer-allow-in-x86-64-linux)) –