2017-09-08 6 views
-1

私はアセンブリが初めてで、メモリに格納された文字列を繰り返し処理しようとしています。 lea(実効アドレスをロード)命令を使用して文字列のアドレスを取得できますが、今はレジスタに格納されているそのアドレスを使用したいと思います。アセンブリ内のレジスタに格納されているメモリアドレスの内容をロードする方法は?

は、次のように使用することができlwアナログあり:

lea string, %edx  ; Load effective address of string into edx 
lw %edx, %eax  ; Load eax with the value stored where edx points 

... 
string: 
    .string "Hello" 
+1

インテルは、メモリアクセスのための構文[アドレス]を持っています。ほとんどすべての基本命令、値をフェッチするだけでなく、基本的な算術演算にも 'mov'を適用できます。しかし、gas/AT&T構文を使用しているので、メモリ参照は 'offset(r_base、r_index、index_scale_factor)'となります。ここで 'offset'と' index_scale_factor'は数字(またはシンボル)です。だから 'mov eax、[edx]; movl al、[arrayX + edi * 8 + esi] '=' movb arrayX(%esi、%edi、8)のようなもっと複雑な文字列 '=' movl(%edx)、%eax'の最初の4文字を読み込みます。 )、%al' – Ped7g

+0

あなたは指示を守ろうとしているようです。しばらくお待ちいただいても、遅かれ早かれ、SO組立に関する最も一般的な質問の "divide overflow"のような何かに遭遇するでしょう。なぜなら、人々は 'div%ebx'が分割することを期待しているからですeax/ebx、そうではありません。いくつかの命令セットリファレンスガイドを入手し、いくつかのGAS/AT&Tアセンブリ構文リファレンスガイドを入手してください。そしてそれらをすばやく何度も通過してください。 (そして、8086モードで可能なメモリアドレッシングモードは非常に限られています...あなたの 'lea string、%edx'は8086で無効です...) – Ped7g

+0

@ Ped7g私は実際にこれを参考にリファレンスとして使用していますhttp://flint.cs.yale.edu/cs421/papers/x86-asm/asm.html#registers、私は 'lw'のようなものを見つけることができませんでしたので、私は質問しました。あなたは正しいですが、私はアドレッシングモードをよりよく理解する必要があります。 – Bhargav

答えて

1

「MOV」は、間接的にはあなたが「いずれかのモードに基づいて、いくつかのレジスタの制約条件を持っている(アドレッシングで、あなたが探しているものです

+0

私に例を挙げてもらえますか?私は 'mov%edx、%eax'を実行しようとすると何か間違っていると思います。なぜなら、コンテンツを移動するだけなので、eaxには大きな数は移動​​しますが、メモリアドレスの内容は移動しないからです。 – Bhargav

+0

そうですね、間接アドレッシングは使用していません。 AT&Tの構文でそれを行う方法を見つける必要があります。私は本質的にAT&Tの構文のための読み取り専用です。私は情熱をもってそれを嫌うので、MOV EAX、[EDX] –

関連する問題