问题描述
我是组装新手,正在从 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 (将#修改为@)