汇编程序中EDI和ESI寄存器的实际用途和用途是什么?
我知道它们是用来做字符串操作的。
有没有人也能举个例子?
发布于 2009-12-07 03:38:09
像MOVSB和MOVSW这样的操作码,可以有效地将数据从ESI指向的内存复制到EDI指向的内存。因此,
mov esi, source_address
mov edi, destination_address
mov ecx, byte_count
cld
rep movsb ; fast!
发布于 2009-12-07 05:08:05
除了字符串操作(MOVS/INS/STOS/CMPS/SCASB/W/D/Q等)在其他答案中提到的,我想补充的是,还有一些更“现代”的x86汇编指令,它们至少隐含地使用了EDI/RDI:
SSE2 MASKMOVDQU
(和即将到来的AVX VMASKMOVDQU
)指令选择性地将字节从XMM寄存器写入到EDI/RDI指向的内存。
发布于 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位调用约定不同,我不确定这些寄存器是否保留调用。
https://stackoverflow.com/questions/1856320
复制相似问题