2016-09-21 3 views
-1
movq %rax,%rdx 

movq 13(%rax),%rdx 

movq 0x47(%rax,%rcx),%rdx 

rcx = 0000000000000030 
rax = 0000000008048a37 

私はこれらの3つのアセンブリライン命令の違いは何ですか?私は最初のものが8048a37を%rdxに動かしていることを知っています。 第2のものでは、私は8048a4を得るために13を8048a37に追加し、8048a4aが指しているものは%rdxに移動させなければならないと思います。 3番目のものでは、rax、rdx、47を追加して8048aaeを取得し、8048aaeが指しているものが%rdxに移動したとします。アセンブリの基礎 - movq

+3

プロセッサのマニュアルは、IntelとAMDの両方から自由にダウンロードできます。それらには、すべての命令とアドレッシングモードの包括的なリファレンスが含まれています。 –

+1

正確に。あなたの観察は正しい。 – fuz

+0

ああ..あなたの観察結果が正しく表示されませんでした。ごめんなさい!!! – amanuel2

答えて

2

これらのアセンブリ命令の違いは、オフセットにアクセスしていることです。それらを介して行くことができます:)

movq %rax,%rdx 

ちょうどRDXレジスタ(EDX 32ビット用の64ビット・レジスタ)

movq 13(%rax),%rdx 

はRAXレジスタのアドレスを移動するRAXレジスタ(EAXのビットのための64ビットレジスタ)を移動

movq 0x47(%rax,%rcx),%rdx 

登録RDX 13のオフセットとRDXレジスタに0x47 + RAXレジスタ+ RCXレジスタのアドレスを移動します。

+3

ロード実効アドレス命令( 'lea')はアドレスを移動します。質問の説明は正しいです。 – user3386109

0

movq %rax, %rdx - RAXレジスタの内容をRDXレジスタに移動します。

movq 13(%rax), %rdx - メモリからRDXレジスタにアドレス[RAX + 13]の8バイト値をロードします。

movq 0x47(%rax,%rcx),%rdx - アドレス[RAX + RCX + 0x47]の8バイト値をメモリからRDXレジスタにロードします。

+0

いいえ、ディスプレースメント(0x47)はオペランドサイズでスケーリングされません。 asmソースの変位は、常にバイト単位です。 (楽しい事実:AVX512のdisp8変位のマシンエンコーディングは、オペランドサイズでスケーリングされるので、コンパクトなディスプレースメントで+127 * 64バイトに達することができますが、 'vcmpeqps 13(%rax)、%zmm1、%k1' -bitメモリオペランド)はdisp32が必要です。なぜなら、13は64の倍数ではないからです。しかし、私が言ったように、ソースに書き込む方法には影響しません。 –