我在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
行会出现分段错误。
为什么这不起作用?
答案 0 :(得分:3)
除了at& t语法的特殊性之外,你把一切都搞定了:你需要$
签名即时,并且你在那里立即使用地址。所以你真正想要的是addl $dict, %eax
。您从地址dict
的内存中加载了一个值,然后将其用作地址,从而导致错误。