2016-04-29 42 views
2

在IA-32英特尔指令集参考中,STOS/STOSB/STOSW/STOSD,指令stos m32stosd有什么区别,是不是它们的描述是一样的?
m32的功能是什么?当我们使用该指令时,我们应该设置eaxesedim32操作数是否有效?汇编:`stos m32`和`stosd`助记符有什么区别?

+0

听起来很奇怪,但使用STOS与内存操作数使得汇编使用** **大小的内存操作数(字节,字,双字)来确定是否将其编码为STOSB,STOSW,STOSD。 –

+0

然后是否使用'm32'操作数,它只是用来确定内存operande的大小,所以只要大小正确,我们就可以随机选择'm32'操作数。 @MichaelPetch – zhenguoli

+0

它只用于尺寸。它指向的内容被忽略。我认识的大多数开发人员使用STOSB,STOSW,STOSD。如果您使用_MASM_,则是一个例外。在那个环境中,当你声明一个变量MASM时,会跟踪变量的类型。最终结果是相同的 - 只是使用大小。 –

回答

2

STOS m32形式和STOSD形式是表达相同指令的两种不同方式。您可能已经注意到,在较新的SIMD(SSE,AVX等...)指令之外,大多数指令助记符没有后缀,指示它们执行的操作的大小。例如没有INCD或MOVW指令。相反,操作数的大小决定了操作的大小。 STOS m32表格允许此指令符合此惯例。

在MASM这允许像下面的代码,其中STOS指令的大小取决于符号的类型(尺寸):

array DW 30 DUP (?) 

    mov ecx, LENGTH array 
    mov edi, OFFSET array 
    mov eax, 1 
    rep stos array 

更改DW到DD和代码将填补个DWORD的以1s的阵列而不是一组WORD。请注意,仅使用内存操作数的大小。该指令仍写入由EDI给出的地址。

虽然它不适用于STOS,但某些其他字符串指令的内存操作数形式可让您覆盖默认DS段。 (该STOS指令使用ES段不能覆盖。)因此,例如,你可以这样做:

rep outs dx, WORD PTR fs:[esi] 
+2

不仅可以覆盖默认段,而且还可以使用具有“67”前缀的地址大小,以便给我们例如在32位模式下使用'stos dword [es:di]'。 – Ruslan