0

NASM [ビット64]を使用して、64ビットLinuxでコードを書きました

section .text
global main
main:                  ; ELF entry point

mov rax, 1
mov rdi, 1
mov rsi, message       ; buffer
mov rdx, [messageLen]  ; length of buffer
syscall

mov rax, 60            ; sys_exit
mov rdi, 0             ; 0
syscall

ret

section .data
data1:  db 35,36,37

messageLen: dq message.end-message
message: db 'Hello 999  World!!!', 10
.end:

今、

mov rax, message 

rax は「メッセージ」のアドレス (例: 0x402044) を保持します。

lea rax, [message]

逆アセンブルを調べたところ、次のようにコードが実行されていることがわかりました

movabs rax, 0x402044

32 ビット MASM で mov reg, label コマンドを実行すると、ラベルが参照する配列から最初のデータが移動されました。

mov ax, label ; same as mov ax, [label]

最後に!!、ここでの私の質問は、64ビットがアドレスをロードするのに、なぜ32ビットがデータ値をロードするのですか? 64 ビットで記述されたコードを 32 ビット システムで使用したい場合、下位互換性の問題は発生しませんか?

質問が非常に基本的および/または些細なことでしたら、申し訳ありません。私はこれについて数時間頭を悩ませてきましたが、ラベルをロードする 2 つの異なる実装の背後にあるロジックがよくわかりません。ありがとう!!

4

1 に答える 1

1

これは、32 ビットと 64 ビットの違いではありません。これは、2 つの異なるアセンブラーの違いです。

NASM ではmov eax, var、 のアドレスをvarに入れますeax。MASM では、同じコードで の内容をvarin に入れeaxます。

MASM でのアドレスを取得するには、次の演算子varを使用する必要があります。offset

mov eax, offset var

違いを説明している NASM ドキュメントのこのセクションも参照してください。

于 2012-12-23T09:44:56.253 に答える