STOS/STOSB/STOSW/STOSD/STOSQ---存储字符串

STOS/STOSB/STOSW/STOSD/STOSQ--- 存储字符串

 

该指令在 64 位或非 64 位模式下,分别从 AL/AX/EAX 存储一个字节 / / 双字到目标操作数中。目标操作数是一个内存地址(根据指令的地址大小属性和操作模式),由 ES:EDI ES:DI 指定。 ES 段寄存器不能被其他段超越( override )。

 

在汇编编码层次上,该指令有两种形式:指明操作数方式和无操作数方式。(译注:这是相对于编译后的机器码层次,因为编译后只有一种形式。)指明操作数方式(助记符为 STOS )允许明确指出目标操作数。这里的目标操作数是一个能够确定目标大小和位置的标号。根据目标的操作数大小,使用与之匹配的源操作数( AL 对应字节大小操作数, AX 对应字大小操作数, EAX 对应双字大小操作数)。

 

指明操作数方式主要是便于文档化( documentation ,译注:即一目了然的看出数据是存到什么地方的。);然而这种方式会引起误导。因为目标操作数必须指定正确的大小(是字节、字还是双字),但是不一定要指定正确的位置。位置总是由 ES:(E)DI 来指定的,所以在串指令执行前必须加载好正确的位置。

 

无操作数方式是 STOS 指令的字节、字、双字、 8 字方式的简化版本。同样这里 ES:(E)DI 为目标地址, AL/AX/EAX 为源操作数。目标及源操作数大小由指令助记符来确定: STOSB( AL 读取字节 );STOSW( AX 中读取字 );STOSD (从 EAX 中读取双字) .

 

当字节、字、双字从寄存器中转移到目标地址后,( E)DI 寄存器会根据 EFLAGS 中的 DF 标记来决定增加还是减少。如果 DF=0 ,寄存器就增加;如果 DF=1 ,寄存器就减少(寄存器增加或减少的量:字节操作是 1 ;字操作是 2 ;双字操作是 4 )。

 

64 位模式下,因为缺省的地址大小是 64 位,所以 32 位地址大小需要添加前缀 67H 。对 REX 使用 REX.W 的前缀可以将双字的操作数提升至 8 字节操作数。提升后无操作数的指令助记符为 STOSQ STOSQ( 及它的指明操作数方式 ) RAX 寄存器中 8 字节拷贝至由 RDI EDI 指定的目标地址中。

 

在进行块传送时,可以由 ECX 指定传送的字节数、字数、双字数,在 STOS STOSB STOSW STOSD STOSQ 前面加上一个 REP 前缀来实现传送。然而更常见的情况是,这些指令用在一个 LOOP 循环中,因为在使用这些指令前先要将数据保存到 AL,EA,EAX 寄存器中。

 

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值