4
我反汇编了某些二进制文件(Linux elf)。 我发现这个代码:ds,es注册
movsl %ds:(%esi),%es:(%edi)
有两个寄存器 'DS' 和 'ES'。 我知道这些被命名为'段寄存器'。 但是,没有像'mov addr,%es(或%ds)'这样的行。 这些寄存器指向哪里?
我反汇编了某些二进制文件(Linux elf)。 我发现这个代码:ds,es注册
movsl %ds:(%esi),%es:(%edi)
有两个寄存器 'DS' 和 'ES'。 我知道这些被命名为'段寄存器'。 但是,没有像'mov addr,%es(或%ds)'这样的行。 这些寄存器指向哪里?
段寄存器由操作系统初始化。对于大多数现代操作系统,他们指向指向整个地址空间的同一段,因为大多数操作系统使用平坦内存模型(即无分段)。
不使用ds
(几乎所有内存访问的默认值)的原因是movs
的操作数是隐含的,在DOS时代是有意义的。
在DOS(实模式)时代,实际使用了它们,因为寄存器限于16Bit,因此限制为64K的地址空间。地址空间(1M)被划分为重叠的64K段。