【问题标题】:Meaning of "ds:" in assembly language“ds:”在汇编语言中的含义
【发布时间】:2015-05-05 10:30:30
【问题描述】:

我只是汇编语言的初学者,可能有一些愚蠢的问题。这两行有什么区别?

3e 8b 06 mov eax,DWORD PTR ds:[esi]
8b 06    mov eax,DWORD PTR [esi]

在我看来也是如此,我也试过这个程序:

int main()
{
    __asm
    {
        mov esi, ebx
        mov eax,DWORD PTR [esi]
        mov ebx,DWORD PTR ds:[esi]
    }

    return 0;
}

它证实了我的猜测,所以问你们,如果有什么不同。为什么我们需要两条功能相同但操作码长度不同的指令。

【问题讨论】:

  • ds 在这种情况下是默认段,因此除了额外的前缀字节之外确实没有区别。此外,在典型的操作系统下,csdsesss 段都引用相同的内存。
  • @Jester 只是想知道,不同内存中的段不是典型的操作系统。
  • 例如,一个实模式,如 DOS(如果您仍然可以称其为操作系统)。此外,段 fs 和/或 gs 用于特殊目的,例如线程本地存储,它们通常放置在偏移处。
  • 唯一不平凡地使用段的主流操作系统是 MS-DOS 和 Windows 3.x。但是,那些是 16 位的,所以通常不使用 32 位寄存器 eax 等。

标签: assembly x86


【解决方案1】:

第一条指令中的3E 字节是DS 段覆盖前缀(参见英特尔软件开发人员手册中的“2.1.1 指令前缀”)。

第 2 组
— 段覆盖前缀:
• 3EH—DS 段覆盖前缀(保留与任何分支指令一起使用)

在这种情况下它是多余的,因为ds 是大多数内存访问的默认段。此外,如果您有一个平坦的 32 位内存空间,您通常永远不会明确指定段寄存器,因为它们被设置为指向相同的内存。

【讨论】:

  • 非常感谢。我想过类似的事情,但很高兴得到确认。
【解决方案2】:

1) DS = 数据段

2) 两种不同的操作码,因为两种不同的“寻址模式”。 3) 这是两种不同类型的基于 x86 er 的所谓“寻址模式”。 asm中的一个非常基本的东西。

a)https://cs.nyu.edu/courses/fall10/V22.0201-002/addressing_modes.pdf b) http://www.ic.unicamp.br/~celio/mc404s2-03/addr_modes/intel_addr.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2013-01-17
    相关资源
    最近更新 更多