首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ESI和EDI寄存器的用途?

ESI和EDI寄存器的用途?
EN

Stack Overflow用户
提问于 2009-12-07 03:26:38
回答 3查看 218.3K关注 0票数 132

汇编程序中EDI和ESI寄存器的实际用途和用途是什么?

我知道它们是用来做字符串操作的。

有没有人也能举个例子?

EN

回答 3

Stack Overflow用户

发布于 2009-12-07 03:38:09

像MOVSB和MOVSW这样的操作码,可以有效地将数据从ESI指向的内存复制到EDI指向的内存。因此,

代码语言:javascript
复制
mov esi, source_address
mov edi, destination_address
mov ecx, byte_count
cld
rep movsb ; fast!
票数 38
EN

Stack Overflow用户

发布于 2009-12-07 05:08:05

除了字符串操作(MOVS/INS/STOS/CMPS/SCASB/W/D/Q等)在其他答案中提到的,我想补充的是,还有一些更“现代”的x86汇编指令,它们至少隐含地使用了EDI/RDI:

SSE2 MASKMOVDQU (和即将到来的AVX VMASKMOVDQU)指令选择性地将字节从XMM寄存器写入到EDI/RDI指向的内存。

票数 12
EN

Stack Overflow用户

发布于 2016-10-22 21:02:23

除了用于大容量操作的寄存器之外,它们还可以通过32位调用约定中的函数调用(调用保留)来保留它们的属性。ESI、EDI、EBX、EBP、ESP被调用保留,而EAX、ECX和EDX不被调用保留。调用保留寄存器是由C库函数遵守的,并且它们的值在C库函数调用期间保持不变。

Jeff Duntemann在他的汇编语言书中有一个用于打印命令行参数的示例汇编代码。代码使用esi和edi来存储计数器,因为它们将被C库函数printf更改。对于其他寄存器,如eax、ecx、edx,不能保证它们不会被C库函数使用。

https://www.amazon.com/Assembly-Language-Step-Step-Programming/dp/0470497025

请参见第12.8节C如何查看命令行参数。

请注意,64位调用约定与32位调用约定不同,我不确定这些寄存器是否保留调用。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1856320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档