gpt4 book ai didi

assembly - [ebp*2] 是否引用 DS 或 SS 段?

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

IDM 表示如果 EBP 用作基址寄存器,则内存操作使用 SS 段。结果,[ebp + esi][esi + ebp]分别引用 SS 和 DS 段。请参阅 NASM 的文档:3.3 Effective Address .

在上面的同一节中,NASM 提到了如何通过替换 [eax*2] 来生成更短的机器码。与 [eax+eax] .

但是,NASM 也会生成 [ebp + ebp][ebp*2] (即没有基址寄存器)。

我怀疑 [ebp+ebp]引用 SS 段,和 [ebp*2]引用 DS 段。

我问了 NASM 这个问题。他们认为[ebp*2][ebp+ebp]是一样的,但对我来说没有意义。显然,[ebp+ebp] (ebp 作为基址寄存器)引用 SS 段。如果它们相同,[ebp*2也必须引用SS。这意味着只要 ebp 就会引用 SS是基址或索引寄存器,这反过来意味着,[ebp + esi][esi + ebp]引用 SS 段,因此它们必须相同。

有谁知道哪个段[ebp*2]用途?

最佳答案

Intel 手册在下图 3-11 中告诉我们,处理 Offset = Base + (Index * Scale) + Displacement :

The uses of general-purpose registers as base or index components are restricted in the following manner:

  • The ESP register cannot be used as an index register.
  • When the ESP or EBP register is used as the base, the SS segment is the default segment. In all other cases, the DS segment is the default segment.


这意味着 NASM 更改时是错误的 [ebp*2]进入 [ebp+ebp] (为了避免32bit位移)。
[ebp*2]用途 DS因为 ebp不用作基础 [ebp+ebp]用途 SS因为其中之一 ebp用作基础

然后最好指定您不希望 NASM 出现这种行为。
在 NASM 作者意识到他们的错误之前,您可以通过编写以下内容禁用此行为(其中 EBP 用作索引):
[NoSplit ebp*2]

关于assembly - [ebp*2] 是否引用 DS 或 SS 段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49721801/

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