如果我在 x86 AT&T 语法中省略了比例因子和索引寻址模式,会发生什么?

问题描述

我是组装新手,正在从 Programming from the Ground Up 那里学习。这本书在第 41 页和第 42 页讨论了索引寻址模式。

内存地址引用的一般形式是这样的: ADDRESS_OR_OFFSET(%BASE_OR_OFFSET,%INDEX,MULTIPLIER)
所有字段都是可选的。要计算地址,只需执行以下计算:
FINAL ADDRESS = ADDRESS_OR_OFFSET + %BASE_OR_OFFSET + MULTIPLIER * %INDEX
ADDRESS_OR_OFFSET 和 MULTIPLIER 都必须是常量,而另外两个必须是寄存器。 如果有任何部分被遗漏,它只是在等式中用零代替。

所以我决定稍微尝试一下。我写了以下一段代码:

.code32
.section .data
str:
    .ascii "Hello world\0"

.section .text
.global _start
_start:
    movl $2,%ecx       # The index register.
    mov str(,%ecx,),%bl
    movl $1,%eax
    int $0x80

我希望得到 72(H 的 ASCII 代码)作为程序的退出结果,因为没有任何乘数(根据这本书,应该用零代替)。但令人惊讶的是,我得到了 108(l 的 ASCII 代码)。我认为这可能是 .ascii 的事情,并尝试查看是否可以使用不同的数据类型获得不同的结果。我用 .byte 也得到了相同的结果。

我尝试使用 AT&T 语法在 x86 程序集中查找索引寻址模式,但找不到任何有用的信息(可能是因为我不知道要搜索什么)。

有什么我遗漏的地方还是书中的错误?鉴于我是该领域的新手,如果您能详细说明,我真的很感激。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)