assembly - 将基于索引模式转换为间接寻址模式(x86 汇编)

标签 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 行处遇到段错误。

为什么这不起作用?

最佳答案

除了 at&t 语法的特殊性之外,您一切都正确:您需要 $ 符号来表示立即数,并且您使用地址作为立即数。所以你真正想要的是addl $dict, %eax。您从地址 dict 处的内存中加载了一个值,然后将其用作地址,从而导致了错误。

关于assembly - 将基于索引模式转换为间接寻址模式(x86 汇编),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29497623/

相关文章:

assembly - LEA指令?

python - 将 AT&T 语音转文本 API 与 Python 结合使用

c - asm()的 "long form"是什么?

assembly - "mov eax, [num]"和 "mov eax, num"之间的区别

c - gcc内联汇编错误

assembly - 测试点 %eax %eax

assembly - 如何理解这段 AT&T i386 汇编代码片段?

assembly - 复制到 NASM 中的阵列

c++ - Cmake不会将汇编程序标志设置为armasm(对于WinCE)

gcc - 测试指令和与指令 x86