基于变换的索引模式转换为间接寻址模式(x86汇编)

时间:2015-04-07 17:33:48

标签: assembly x86 att addressing

我在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行会出现分段错误。

为什么这不起作用?

1 个答案:

答案 0 :(得分:3)

除了at& t语法的特殊性之外,你把一切都搞定了:你需要$签名即时,并且你在那里立即使用地址。所以你真正想要的是addl $dict, %eax。您从地址dict的内存中加载了一个值,然后将其用作地址,从而导致错误。