我最近偶然发现了以下汇编指令序列:
rep stos dword ptr [edi]
答案 0 :(得分:58)
对于ecx
次重复,将eax
的内容存储到edi
指向的地方,每次增加或减少edi
(取决于方向标志)4个字节。通常,这用于memset
类型的操作。
通常,该指令只是写成rep stosd
。经验丰富的装配编码人员只要看到这一点就知道上面提到的所有细节。 : - )
完整性的ETA(感谢PhiS):每次迭代,ecx
递减1,循环在达到零时停止。对于stos
,您唯一要注意的是ecx
最后会被清除。但是,对于使用scas
/ repz
前缀的repnz
之类,如果操作在耗尽ecx
之前停止,ecx
可能会大于零字节/字/凡是。
在您提问之前,scas
用于实施strchr
类型的操作。 :-P
答案 1 :(得分:0)
Empty array:
char buff[256] = { };
776 1c5: 48 8d 95 e0 fc ff ff lea -0x320(%rbp),%rdx
777 1cc: b8 00 00 00 00 mov $0x0,%eax
778 1d1: b9 20 00 00 00 mov $0x20,%ecx
779 1d6: 48 89 d7 mov %rdx,%rdi
780 1d9: f3 48 ab **rep stos %rax,%es:(%rdi)**