Assembly ds:si和es:di在汇编中是什么意思?

Assembly ds:si和es:di在汇编中是什么意思?,assembly,x86-16,cpu-registers,addressing-mode,memory-segmentation,Assembly,X86 16,Cpu Registers,Addressing Mode,Memory Segmentation,movsb(移动字符串,字节)指令获取地址处的字节 ds:si,将其存储在地址es:di,然后递增或递减 si和di寄存器为1 我知道esi,si和edi,di注册 但不是ds:si和es:di 它们是什么意思?ds:si和es:di表示相关寄存器引用的段:偏移量。当您在实模式下工作时(每个偏移量最大为64K),这一点非常重要 在实模式下,段偏移量组合为段*16+偏移量 在保护模式下,段寄存器保存一个“选择器”。选择器引用的内存的基址与选择器本身的值没有直接关系——相反,选择器只是作为一个索引来

movsb(移动字符串,字节)指令获取地址处的字节 ds:si,将其存储在地址es:di,然后递增或递减 si和di寄存器为1

我知道esi,si和edi,di注册

但不是
ds:si
es:di


它们是什么意思?

ds:si
es:di
表示相关寄存器引用的段:偏移量。当您在实模式下工作时(每个偏移量最大为64K),这一点非常重要

在实模式下,段偏移量组合为
段*16+偏移量


在保护模式下,段寄存器保存一个“选择器”。选择器引用的内存的基址与选择器本身的值没有直接关系——相反,选择器只是作为一个索引来查找表中的数据。然而,在通常情况下,这意味着非常少——大多数(当前)受保护模式环境都设置了CS、DS、ES和SS,所有这些环境的基址都设置为0,最大偏移量为4G字节,因此通过DS和ES寻址没有什么区别。

这些是16位寄存器,它们用于LODSB或其他通过内存循环并应用或复制数据的操作。您将一个地址加载到es:di或ds:si中,并将cx设置为需要top copy的任何字节或字计数,然后调用LODSB LOADSW或其他名称。您甚至可以使用这两种方法从一个内存位置复制到另一个内存位置。 请参见此处的示例,其中他们将字符串复制到串行端口:

一本好书:如果你想知道16位代码是如何工作的,那么你必须回到上个世纪,理解段寄存器。你的意思是说我们不需要手动指定
ds
es
的值吗?@new_perl:不,在几乎所有合理的最新版本上都不需要。那么谁来操作段寄存器呢?
segment*16+偏移量
是否指向物理内存地址?@new_perl:在实模式下(使用segment*16+偏移量),是的。在保护模式下,段寄存器中的选择器用于表查找,并且在表中找到基址。操作系统是否在实模式下工作,而用户应用程序在保护模式下工作?