_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam
local @szBuffer[128]:byte
local @szBuffer1[128]:byte
local @szTextBuff[2048]:byte
local @dwCount
...
lea esi,@szBuffer
.while @dwCount
lodsd
lea ecx,@szBuffer1 //就是这一行,为什么不放到循环外面去?
invoke SendDlgItemMessage,hWnd,IDC_LISTBOX2,LB_GETTEXT,eax,ecx
invoke lstrcat,addr @szTextBuff,addr szReturn
invoke lstrcat,addr @szTextBuff,addr @szBuffer1
dec @dwCount
.endw
...
_ProcDlgMain endp
并不太清楚题主的平台,语言以及编译器等情况,我就按照自己理解的一般情况来说。
一般对于x86 calling convention来说,特别的,如果这是c语言编译后的结果,使用的cdecl calling convention,那么ECX是由调用者保存的,换句话说由于被调用的函数并不负责保存ECX, 题主例子中的ECX值可能在后续的函数调用后被覆盖。
Registers EAX, ECX, and EDX are caller-saved, and the rest are callee-saved.
所以,像题主的例子里,每次去获取那个buffer的地址并写入ECX是外层调用者保存ECX的手段。