stosB、stosw等命令的用法

来源:互联网 发布:专有网络 ftp 编辑:程序博客网 时间:2024/05/17 02:46


操作码指令说明

AA

STOS m8

将 AL 存储到地址 ES:(E)DI

AB

STOS m16

将 AX 存储到地址 ES:(E)DI

AB

STOS m32

将 EAX 存储到地址 ES:(E)DI

AA

STOSB

将 AL 存储到地址 ES:(E)DI

AB

STOSW

将 AX 存储到地址 ES:(E)DI

AB

STOSD

将 EAX 存储到地址 ES:(E)DI

说明

将 AL、AX 或 EAX 寄存器中的字节、字或双字分别存储到目标操作数。目标操作数是内存位置,其地址从 ES:EDI 或 ES:DI 寄存器读取(具体取决于指令的地址大小属性,分别是 32 或 16)。ES 段不能使用跨段前缀覆盖。

在汇编代码级别,此指令允许采用两种形式:“显式操作数”形式与“无操作数”形式。显式操作数形式(使用 STOS 助记符指定)可以明确指定目标操作数。这里,目标操作数应该是表示目标值大小与位置的符号。接着,自动选择与目标操作数大小匹配的源操作数(对于字节操作数,选择 AL 寄存器;对于字操作数,选择 AX;对于双字操作数,选择 EAX)。提供此显式操作数形式是为了便于记录;不过请注意,此形式提供的记录可能会令人误解。也就是说,目标操作数符号必须指定操作数(字节、字或双字)的正确类型(大小),但不必指定正确的位置。位置总是由 ES:(E)DI 寄存器指定,在执行存储字符串指令之前,必须先正确加载这些寄存器。

无操作数形式提供“简短形式”的字节、字及双字版 STOS 指令。这里,同样假设 ES:(E)DI 是目标操作数,假设 AL、AX 或 EAX 寄存器是源操作数。目标操作数与源操作数的大小使用助记符选择:STOSB(从寄存器 AL 读取的字节)、STOSW(从 AX 读取的字)或 STOSD(从 EAX 读取的双字)。

从 AL、AX 或 EAX 寄存器将字节、字或双字传输到内存位置之后,根据 EFLAGS 寄存器中的 DF 标志的设置,(E)DI 寄存器会自动递增或递减。(如果 DF 标志是 0,则 (E)DI 寄存器递增;如果 DF 标志是 1,则 (E)DI 寄存器递减)。对于字节操作,(E)DI 寄存器递增或递减 1;对于字操作,递增或递减 2;对于双字操作,递增或递减 4。

通过 REP 前缀,可以使用 STOS、STOSB、STOSW 及 STOSD 指令整块加载 ECX 字节、字或双字。不过,这些指令更经常用在 LOOP 结构中,因为数据需要先移到 AL、AX 或 EAX,然后才可以存储。如需有关 REP 前缀的说明,请参阅本章的 。

原创粉丝点击