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

本文详细介绍了STOS指令的功能和使用方法。STOS指令用于将寄存器中的数据存储到内存中,支持字节、字、双字和8字节的数据类型。文章解释了指令的不同形式及其如何应用于实际编程中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<!-- [if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:PunctuationKerning /> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:Compatibility> <w:SpaceForUL /> <w:BalanceSingleByteDoubleByteWidth /> <w:DoNotLeaveBackslashAlone /> <w:ULTrailSpace /> <w:DoNotExpandShiftReturn /> <w:AdjustLineHeightInTable /> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:UseFELayout /> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]-->

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

该指令在 64 位或非 64 位模式下,分别从 AL/AX/EAX 存储一个字节 // 双字到目标操作数中。目标操作数是一个内存地址(根据指令的地址大小属性和操作模式),由 ES:EDIES: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 字节操作数。提升后无操作数的指令助记符为 STOSQSTOSQ( 及它的指明操作数方式 )RAX 寄存器中 8 字节拷贝至由 RDIEDI 指定的目标地址中。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值