私はアセンブリが初めてで、メモリに格納された文字列を繰り返し処理しようとしています。 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"
インテルは、メモリアクセスのための構文[アドレス]を持っています。ほとんどすべての基本命令、値をフェッチするだけでなく、基本的な算術演算にも '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
あなたは指示を守ろうとしているようです。しばらくお待ちいただいても、遅かれ早かれ、SO組立に関する最も一般的な質問の "divide overflow"のような何かに遭遇するでしょう。なぜなら、人々は 'div%ebx'が分割することを期待しているからですeax/ebx、そうではありません。いくつかの命令セットリファレンスガイドを入手し、いくつかのGAS/AT&Tアセンブリ構文リファレンスガイドを入手してください。そしてそれらをすばやく何度も通過してください。 (そして、8086モードで可能なメモリアドレッシングモードは非常に限られています...あなたの 'lea string、%edx'は8086で無効です...) – Ped7g
@ Ped7g私は実際にこれを参考にリファレンスとして使用していますhttp://flint.cs.yale.edu/cs421/papers/x86-asm/asm.html#registers、私は 'lw'のようなものを見つけることができませんでしたので、私は質問しました。あなたは正しいですが、私はアドレッシングモードをよりよく理解する必要があります。 – Bhargav