ESI和EDI寄存器的用途?


Answers:


77

只能使用DI / SI 进行一些操作(如果您在1985年没有学习ASM,则可以进行扩展操作)。其中有

REP STOSB
REP MOVSB
REP SCASB

它们分别是用于重复(=质量)存储,加载和扫描的操作。您要做的是将SI和/或DI设置为指向一个或两个操作数,也许在CX中加上一个数字,然后撕开。这些操作一次只处理一堆字节,并且使CPU处于自动状态。因为您没有显式地编码循环,所以它们(通常)比手工编码的循环更有效地完成其工作。

万一您想知道:根据设置操作的方式,重复存储可能很简单,例如将值0冲压到大的连续内存块中;我认为,MOVSB用于将数据从一个缓冲区(那么,任何一堆字节)复制到另一个缓冲区;和SCASB用于查找与某些搜索条件匹配的字节(我不确定它是否仅在相等性上搜索,或者是什么–您可以查找它:))

那就是这些法规的主要用途。


7
过去的优化技巧:rep stoswrep stosb快得多,因此,如果复制两个字节和两个字节符合您要执行的操作,请在手动优化的16位x86汇编代码中使用它。
亚历山大

88

SI=源索引
DI=目标索引

正如其他人指出的那样,它们在字符串指令中有特殊用途。对于实模式编程,ES段寄存器必须使用DI,并DSSI作为

movsb  es:di, ds:si

SI和DI也可以用作通用索引寄存器。例如C源代码

srcp [srcidx++] = argv [j];

编译成

8B550C         mov    edx,[ebp+0C]
8B0C9A         mov    ecx,[edx+4*ebx]
894CBDAC       mov    [ebp+4*edi-54],ecx
47             inc    edi

其中ebp+12包含argvebxjedi具有srcidx。注意,第三条指令使用edi4乘以0,并加上ebp0x54(的位置srcp)的偏移量;地址周围的括号表示间接寻址。


虽然我不记得在那里我看到了它,但是证实了它最,而(幻灯片17)其他:

AX=累加器
DX=双字累加器
CX=计数器
BX=基址寄存器

它们看起来像通用寄存器,但是有许多指令(意想不到?)隐含地使用其中之一。


37

MOVSB和MOVSW等操作码可将数据从ESI指向的内存有效复制到EDI指向的内存。从而,

mov esi, source_address
mov edi, destination_address
mov ecx, byte_count
cld
rep movsb ; fast!

12

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

SSE2 MASKMOVDQU(以及即将推出的AVX VMASKMOVDQU)指令有选择地将XMM寄存器中的字节写入EDI / RDI指向的内存。


6

除了用于批量操作的寄存器外,它们还有助于通过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位调用约定不同,并且我不确定这些寄存器是否保留调用。


我从来没有听过“神圣的”用来形容大多数人所说的“易失性” /“非易失性”,或“被呼叫者保存”与“被呼叫者保存”。我喜欢“保留呼叫” /“保留呼叫权”,因为这并不意味着它们实际上已保存在任何地方。无论如何,在x86-64 System V ABI中ESI / RSI和EDI / RDI并未保留呼叫。
彼得·科德斯

另外,您忘记了将EBP和ESP列为通用32位调用约定中的保留呼叫。
彼得·科德斯

1
无论如何,这是一个很好的观点。在实际代码中,您更有可能出于呼叫约定原因而选择EDI / ESI,而不是因为它们对于任何指令都是特殊的。
彼得·科德斯

我喜欢保持通话。我用相同的答案更新了答案。感谢您的审查。
杰·拉杰普特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.