gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 21:05:04 25 4
gpt4 key购买 nike

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

The general form of memory address references is this:ADDRESS_OR_OFFSET(%BASE_OR_OFFSET,%INDEX,MULTIPLIER)
All of the fields are optional. To calculate the address, simply perform the following calculation:
FINAL ADDRESS = ADDRESS_OR_OFFSET + %BASE_OR_OFFSET + MULTIPLIER * %INDEX
ADDRESS_OR_OFFSET and MULTIPLIER must both be constants, while the other two must be registers. If any of the pieces is left out, it is just substituted with zero in the equation.


所以我决定稍微玩一下这个。我写了下面的一段代码:
.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 程序集中查找索引寻址模式,但找不到任何有用的信息(可能是因为我不知道要搜索什么)。
有什么我遗漏的或者是书中的错误吗?鉴于我是该领域的新手,如果您详细说明,我真的很感激。

最佳答案

If any of the pieces is left out, it is just substituted with zero in the equation.


这本书的一般规则对于比例因子不是很准确。默认比例因子为 1如果省略。
x86 索引缩放在机器代码中用作 2 位移位计数。
该 asm 默认值是 << 0 的移位计数, 但是 x86 asm 源代码语法(包括 AT&T)使用乘数而不是移位计数来表示这一点,并且 i << 0i * 1 .
如果不需要索引,则需要在寻址模式中省略索引寄存器的提及。

请注意,默认值是汇编程序/语法的属性,在这种情况下是 AT&T,而不是 x86 本身的属性。机器代码中不能有“默认值”——没有办法在字节中省略位,它们必须是 0 或 1。你要么有一个包含所有字段的 SIB 字节(scale-index-base),或者你没有(由 ModRM 字节表示)在这种情况下根本没有索引。
有一个 SIB 编码意味着没有索引,因此在机器代码中,您仍然可以拥有一个根本没有索引的 SIB 字节,但您不会将其描述为乘数为零。
一些反汇编程序将该编码表示为索引 = %eiz ,例如在 nopl 0(%eax, %eiz, 1)显示有一个 SIB 字节但没有索引,但通常你只会看到 NOPS。当那个 SIB-with-no-index is necessary to encode (%esp) ,它被简化为那个。)

x86 机器码有多种语法。尽管我所知道的所有人都同意没有比例只是意味着 shift=0,例如 [str + eax + ecx]英特尔语法;通常,如果大于 1,则选择第一个寄存器作为基址,选择第二个作为索引。
当然,在 Intel 语法中,要强制 ECX 成为没有基址寄存器的索引,您需要使用 [str + ecx*1]故意在 SIB 编码上浪费一个字节。 [str + ecx]英特尔是 AT&T str(%ecx) .

还相关:
  • A couple of questions about [base + index*scale + disp]
  • Referencing the contents of a memory location. (x86 addressing modes)
  • https://stackoverflow.com/tags/att/info
  • 关于assembly - 如果我在 x86 AT&T 语法中省略了比例因子和索引寻址模式,会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67711469/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com