好吧,我知道CLD清除方向标志和STD设置方向标志。 但是在设置和清除方向标志方面有什么意义?在x86汇编语言中CLD和STD是什么? DF做什么?
回答
方向标志用于影响字符串指令偏移指针寄存器的方向。这些说明可以使用with the REP
prefix来重复操作。 (尽管lods
对rep
不是很有用)。
字符串指令是:MOVS
(复制MEM到MEM),STOS
(存储AL/AX/EAX/RAX),SCAS
(扫描字符串),CMPS
(比较字符串),并LODS
(负载字符串)。内存和IO端口之间的复制也有ins
/outs
。每个指令都有字节,字,双字和qword操作数大小。
概括地说,当方向标志是0,该指令通过递增的指针数据每一次迭代之后(直到ECX
是零或一些其它条件,这取决于REP
前缀的香味)工作,而如果该标志是1,指针递减。
例如,movsd
副本(在64位模式或RDI)一个双字从[ds:esi]
到[es:edi]
,并执行此:(参见链接ISA参考手册条目中的“操作”部分从英特尔的PDF文件中提取)
dword [es:edi] = dword [ds:esi] // 4-byte copy memory to memory
if (DF == 0)
esi += 4;
edi += 4;
else // DF == 1
esi -= 4;
edi -= 4;
fi
随着REP前缀,它这样做ECX次,现代x86 CPU的具有优化的“快速字符串”微码与16字节或32字节的内部操作做复制(或stos
存储)。另见this Q&A about memory bandwidth and the ERMSB feature。 (注意只有rep stos
和rep movs
这样优化,而不是repne/repe scas
或cmps
)。
如果使用的是Windows,然后按stdcall调用 -
在STDCALL,方向标志是进入明确的,并且必须是 返回明确。
因此,如果您设置了DF,那么在调用API之前,您必须将其清除。
依赖操作系统。 – amanuel2 2016-10-04 20:02:34
这在大多数32位/ 64位调用约定中很常见,包括i386 System V和x86-64 System V.它可以让您(或编译器)在没有CLD指令的情况下有效地内嵌'rep movsd' /'rep stosd'。 (在现代x86上,它们往往只是快速向上,DF = 0) – 2017-12-03 19:51:16
CLD CLears方向标志,数据向前。 STD设置方向标志,数据向后。
CLD:明确的方向标志,以便每个字符串操作之后该字符串指针 自动递增
STD: STD用于将方向标志设置为1,使得Si和/或DI将自动递减到当其中一个字符串指令执行时指向下一个字符串元素。如果方向标志被设置,SI/DI对于字节字符串将减1,对于字符串将减2。
此答案可能对您有所帮助。
- 1. cmp在汇编语言中做什么
- 2. x86汇编:主要序言和结语是什么?
- 3. 什么是x86 16位汇编语言中的中断69?
- 4. nasm汇编语言中的$是什么?
- 5. CLD在这里做什么?
- 6. 什么是一些好的x86汇编语言资源?
- 7. 这是什么汇编语言?
- 8. 这是写入什么汇编语言?
- 9. x86汇编语言
- 10. bx lr在ARM汇编语言中做了什么?
- 11. 汇编语言 - sarq在代码中做了什么?
- 12. 什么是GCC内联汇编语言中的r()和double%%%?
- 13. “.align”x86汇编程序指令是做什么的?
- 14. 在AT&T汇编语言中,“。=”是指什么?
- 15. “ccout”在汇编语言中的含义是什么?
- 16. x86汇编语言,使用ebx和bh
- 17. 使用x86汇编语言
- 18. 汇编X86语言问题
- 19. 汇编语言x86 Irvine32
- 20. ARM汇编语言uART0输入输出,我做错了什么。
- 21. C++语言中`::`是做什么的?
- 22. x86汇编语言和启动
- 23. 汇编语言和机器语言之间的关系是什么?
- 24. 汇编语言不能做什么,但只有机器语言可以吗?
- 25. 这些汇编语言语句的含义是什么?
- 26. 汇编代码是什么:mov edx,2,3,4是做什么的?
- 27. C代码在Visual Studio中编译成什么汇编语言?
- 28. 汇编语言中的“短”跳是什么意思?
- 29. 汇编语言中的“MOV AH,4CH”是什么意思?
- 30. 在Intel x86汇编手册中,00+是什么意思?
呃,这个位引起的错误数量。我的Turbo Pascal代码使用内联汇编来重置它。 – 2012-03-10 22:49:25