2

我在 Ubuntu 上使用 x86 AT&T 程序集。

我需要将任何复杂的间接寻址模式(例如基于索引的模式)重写为简单的间接寻址模式。

例如,拿这个片段:

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

为什么这不起作用?

4

1 回答 1

3

除了 at&t 语法的特殊性之外,您做对了所有事情:您需要$立即数的符号,并且在那里使用地址作为立即数。所以你真正想要的是addl $dict, %eax. 您在地址处从内存中加载了一个值,dict然后将其用作地址,从而导致了故障。

于 2015-04-07T17:36:52.207 回答