.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
上面这段代码是罗云彬的WIN32汇编书第五章使用列表框中的例子代码。
我想问的是,为什么要lea ecx,@szBuffer1,后面的SendDlgItemMessage函数直接用addr @szBuffer1不行吗?
以我目前的水平实在无法理解,请各位大神帮忙解惑!
------解决方案--------------------
如果 @szBuffer1 是全局变量,即定义在如 .data 或 .data? 里的,应该是可以的;如果是临时变量即以 local 形式定义在子程里的,就不可以了,因为会产生类似指令,只是用的是 eax 而非 ecx ,这样就会破坏了 eax 里的内容,而你这里次一个参数恰恰就是 eax,结果就会错的,所以一般地 invoke 会对这个进行检查,出现这样的情况就会提示那个寄存器被覆盖重写的错误,无法通过编译。