将基于索引的模式转换为间接寻址模式(x86 汇编)
Transform based indexed mode to indirect addressing mode (x86 assembly)
我在 Ubuntu.
上使用 x86 AT&T Assembly
我需要将任何复杂的间接寻址模式(如基于索引模式)重写为简单的间接寻址模式。
例如,拿这个片段:
.L4:
movl i, %eax
movzbl ch, %edx
movb %dl, dict(%eax)
我认为 movb %dl, dict(%eax)
行是基于索引寻址的。它的作用是获取 dict+%eax
并取消引用它,然后将 %dl
放入其中,对吗?
为了简化间接寻址,我现在这样写:
.L4:
movl i, %eax
movzbl ch, %edx
addl dict, %eax
movb %dl, (%eax)
如您所见,我首先添加了 dict
和 %eax
,并将结果也放入了 %eax
。然后在下一行我只是取消引用结果。
这应该与上面的工作方式相同,对吧?
它也可以编译,但是当 运行 它时,我在新的 movb
行遇到分段错误。
为什么这不起作用?
除了 at&t 语法的特殊性外,您一切都正确:您需要 $
立即数符号,并且您将地址用作立即数。所以你真正想要的是addl $dict, %eax
。您从地址 dict
的内存中加载了一个值,后来又将其用作地址,导致了错误。
我在 Ubuntu.
上使用 x86 AT&T Assembly我需要将任何复杂的间接寻址模式(如基于索引模式)重写为简单的间接寻址模式。
例如,拿这个片段:
.L4:
movl i, %eax
movzbl ch, %edx
movb %dl, dict(%eax)
我认为 movb %dl, dict(%eax)
行是基于索引寻址的。它的作用是获取 dict+%eax
并取消引用它,然后将 %dl
放入其中,对吗?
为了简化间接寻址,我现在这样写:
.L4:
movl i, %eax
movzbl ch, %edx
addl dict, %eax
movb %dl, (%eax)
如您所见,我首先添加了 dict
和 %eax
,并将结果也放入了 %eax
。然后在下一行我只是取消引用结果。
这应该与上面的工作方式相同,对吧?
它也可以编译,但是当 运行 它时,我在新的 movb
行遇到分段错误。
为什么这不起作用?
除了 at&t 语法的特殊性外,您一切都正确:您需要 $
立即数符号,并且您将地址用作立即数。所以你真正想要的是addl $dict, %eax
。您从地址 dict
的内存中加载了一个值,后来又将其用作地址,导致了错误。