したがって、私のMacでx86_64のnasmアセンブリを楽しく学びます。こんにちは世界といくつかの基本的な算術の後、私はthis siteから少し高度なhelloの世界のプログラムをコピーし、64ビットのインテルのためにそれを修正しようとしましたが、私はこの1つのエラーメッセージ:hello.s:53: error: Mach-O 64-bit format does not support 32-bit absolute addresses
を取り除くことはできません。ここにアセンブルしてリンクするコマンドは次のとおりです:nasm -f macho64 hello.s && ld -macosx_version_min 10.6 hello.o
。そして、ここで該当する行です:アセンブラエラー:Mach-O 64ビットは絶対32ビットアドレスをサポートしていません
cmp rsi, name+8
RSIは、私はループに私のインデックスに使用していますレジスタであり、名前は、この時点ですでに持っている名前でユーザーの入力のために予約クワッドワードであり、書かれている。ここで
は、コードの一部です(、残りを見るのリンクをクリックして、下に行くために、唯一の違いは、私は64ビットレジスタを使用することである):
loopAgain:
mov al, [rsi] ; al is a 1 byte register
cmp al, 0x0a ; if al holds an ascii newline...
je exitLoop ; then jump to label exitLoop
; If al does not hold an ascii newline...
mov rax, 0x2000004 ; System call write = 4
mov rdi, 1 ; Write to stdout = 1
mov rdx, 1 ; Size to write
syscall
inc rsi
cmp rsi, name+8 ; LINE THAT CAUSES ERROR
jl loopAgain
'name'はどのように定義されていますか? – bdonlan
一つの提案:Cで同じコードを書いてみて、 'gcc -S'でコンパイルして、アセンブリを見てGCCがどのように処理するのか見てみましょう。 – Nemo
@bdonlan:セクション.bssに、私は 'name:resb 8'を持っています。 – mk12