x86寄存器在movsb指令中表示源位置是哪个?

30
movsb指令中,x86寄存器表示源地址位置的是哪一个?

47
这是 osdev.org 的入门问题! - Aquarius_Girl
准确地说!也许当我想加入OS开发时,我甚至已经使用了谷歌搜索。 - manuhg
6
嘿,至少很不可能你是一个机器人。这也是这个问题想要防范的。;-) - C. K. Young
2个回答

37

在 32 位模式下,esi

具体来说,movsb 将一个字节从 ds:esi 复制到 es:edi,然后根据方向标志(DF)递增或递减 esiedi 的值。

英特尔手册详细介绍了每个指令的参考条目。PDF 的 HTML 抓取网站上有 一个关于 movs 的条目,以及关于 rep movs 的条目。


8
今天的x86有趣知识小贴士:SI(或32位系统中的ESI)代表“源索引”,而DI代表“目的地索引”,这来自于这些寄存器的特殊用途。 - Michael Burr
1
请注意,默认的段寄存器DS和ES可以被覆盖以使用其他段寄存器。 - I. J. Kennedy
7
只有 ds 可以被覆盖,es 是固定的。 - C. K. Young
4
一般来说,默认情况下使用 ds 的指令可以用段前缀覆盖;而使用 es 的指令(例如 stosb 等)是固定的,无法被覆盖。 - C. K. Young

10

如何从手册中提取信息

现在您已经登录到osdev.org,是时候通过实际学习来偿还道德债务了。:-)

Intel 手册卷2 指令集参考 - 325383-056US September 2015 "MOVS/MOVSB/MOVSW/MOVSD/MOVSQ—从字符串到字符串移动数据" 节说:

将第二操作数(源操作数)指定的字节、字或双字移动到第一操作数(目的操作数)指定的位置。源操作数和目的操作数都位于内存中。源操作数的地址从DS:ESI或DS:SI寄存器读取。

最小测试程序

最后,您必须编写一个使用该指令的最小程序,以查看您是否正确理解了它:

section .data
    src db 0
    dest db 1
section .text
global _start
_start:
    mov esi, src
    mov edi, dest
    cld
    movsb
    /* dest == 0*/

具有断言的可运行版本,请在GitHub上查看。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接