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