2012-03-20 52 views
4

我反汇编了某些二进制文件(Linux elf)。 我发现这个代码:ds,es注册

movsl %ds:(%esi),%es:(%edi) 

有两个寄存器 'DS' 和 'ES'。 我知道这些被命名为'段寄存器'。 但是,没有像'mov addr,%es(或%ds)'这样的行。 这些寄存器指向哪里?

回答

1

段寄存器由操作系统初始化。对于大多数现代操作系统,他们指向指向整个地址空间的同一段,因为大多数操作系统使用平坦内存模型(即无分段)。

不使用ds(几乎所有内存访问的默认值)的原因是movs的操作数是隐含的,在DOS时代是有意义的。

在DOS(实模式)时代,实际使用了它们,因为寄存器限于16Bit,因此限制为64K的地址空间。地址空间(1M)被划分为重叠的64K段。