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 つの異なる実装の背後にあるロジックがよくわかりません。ありがとう!!