【问题标题】:What do ds:si and es:di mean in assembly?ds:si 和 es:di 在汇编中是什么意思?
【发布时间】:2011-12-19 04:23:18
【问题描述】:

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

我知道 esi,si 和 edi,di 寄存器,

但不是 ds:sies:di

它们是什么意思?

【问题讨论】:

标签: assembly x86-16 cpu-registers addressing-mode memory-segmentation


【解决方案1】:

这些是 16 位寄存器,它们用于像 LODSB 或其他循环槽内存并应用或复制数据的操作。您将地址加载到 es:di 或 ds:si 并将 cx 设置为您需要顶部复制的任何字节数或字数,然后调用 LODSB LOADSW 或其他。您甚至可以同时使用这两种方式从一个内存位置复制到另一个内存位置。 请参阅此处的示例,他们将字符串复制到串行端口: http://vitaly_filatov.tripod.com/ng/asm/asm_000.71.html

【讨论】:

    【解决方案2】:

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

    在实模式下,段偏移合并为segment * 16 + offset

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

    【讨论】:

    • 你的意思是我们不需要手动指定dses的值?
    • @new_perl:不,无论如何,几乎没有任何合理的最新内容。
    • 那么谁在操作段寄存器?segment * 16 + offset 是否指向物理内存地址?
    • @new_perl:在实模式下(使用段*16+偏移),是的。在保护模式下,段寄存器中的选择器用于查表,在表中找到基地址。
    • 操作系统在实模式下工作,但用户应用程序在保护模式下工作,这是真的吗?
    猜你喜欢
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 2017-04-20
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    相关资源
    最近更新 更多