Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 组装:什么&x27;“stos m32”和“stosd”的记忆法有什么区别?_Assembly - Fatal编程技术网

Assembly 组装:什么&x27;“stos m32”和“stosd”的记忆法有什么区别?

Assembly 组装:什么&x27;“stos m32”和“stosd”的记忆法有什么区别?,assembly,Assembly,在IA-32英特尔指令集参考中,指令stos m32和stosd之间有什么区别,它们的描述不一样吗? m32的功能是什么?当我们使用指令时,我们应该设置eax和es,edi,m32操作数是否有效 STOS m32格式和STOSD格式是表达同一指令的两种不同方式。您可能已经注意到,在较新的SIMD(SSE、AVX等)指令之外,大多数指令助记符都没有表示它们执行的操作大小的后缀。例如,没有INCD或MOVW指令。相反,操作数的大小决定操作的大小。STOS m32表格允许本指令与本惯例保持一致 在MA

在IA-32英特尔指令集参考中,指令
stos m32
stosd
之间有什么区别,它们的描述不一样吗?
m32的功能是什么?当我们使用指令时,我们应该设置
eax
es
edi
m32
操作数是否有效

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,代码将用1s填充DWORD数组,而不是单词数组。请注意,仅使用内存操作数的大小。指令仍然写入EDI给定的地址

虽然它不适用于STO,但某些其他字符串指令的内存操作数形式允许覆盖默认DS段。(STOS指令使用无法重写的ES段。)例如,您可以执行以下操作:

    rep outs dx, WORD PTR fs:[esi]

可能看起来很奇怪,但将STO与内存操作数一起使用可以让汇编器使用内存操作数的大小(字节、字、dword)来确定是否将其编码为STOSB、STOSW、STOSD。然后无论是否使用
m32
操作数,它只用于确定内存操作数的大小,因此,只要大小正确,我们就可以随机选择
m32
操作数@MichaelPetchIt仅用于尺寸。它所指的被忽略了。我认识的大多数开发人员都使用STOSB、STOSW和STOSD。例外情况是,如果使用MASM。在该环境中,当您声明变量时,MASM会跟踪变量的类型。虽然最终结果是一样的-只是使用了大小。好的,我会做一个测试。谢谢。您正在阅读一份英特尔insn set参考文档,非常棒。通过更仔细地阅读,你可以回答你自己的问题。两种形式都有相同的机器代码编码,即它们组合成相同的东西。此外,文本描述中的整个第2段都是关于这两种形式存在的原因和原因。不仅可以覆盖默认段,还可以使用
67
前缀来确定地址大小,以便在32位模式下为我们提供例如
stos dword[es:di]