这几天研究了一下原子锁函数。
以下为加一原子锁函数声明:
WINBASEAPI
LONG
WINAPI
InterlockedIncrement (
__inout LONG volatile *lpAddend
);
以下为函数反汇编代码:
7C809776 mov ecx,dword ptr [esp+4]
7C80977A mov eax,1
7C80977F lock xadd dword ptr [ecx],eax
7C809783 inc eax
7C809784 ret 4
一直想不明白为什么要inc eax。
加1的操作,在lock xadd dword ptr [ecx],eax这条指令中已经完成。
后来在一天早上半梦半醒之间,突然想起了,eax寄存器存储返回值。
inc eax是为了要保证返回正确的返回值。
汇编半桶子水,研究反汇编确实比较痛苦。