这个疑问在书中的P171页
- Assembly code
.if ax == IDOK ;如果点击查看 invoke SendDlgItemMessage,hWnd,IDC_LISTBOX2,LB_GETSELCOUNT,0,0 ;返回选中的项目总数 MOV @dwCount,eax invoke SendDlgItemMessage,hWnd,IDC_LISTBOX2,LB_GETSELITEMS,128/4,addr @szBuffer ;返回多选列表框的选中项目索引列表到缓冲区中 invoke lstrcpy,addr @szTextBuff,addr szSelect lea esi,@szBuffer ;将地址传给esi,刚才取得的选中列表索引地址 .while @dwCount [color=#FF0000]lodsd [/color]; lea ecx,@szBuffer1 ;取偏移地址 invoke SendDlgItemMessage,hWnd,IDC_LISTBOX2,LB_GETTEXT,eax,ecx ;返回某个项目的字符串,w:位置索引,l:缓冲区地址 invoke lstrcat,addr @szTextBuff,addr szReturn invoke lstrcat,addr @szTextBuff,addr @szBuffer1 dec @dwCount .endw .endif
问题:这个的lodsd怎么知道df的值是0还是1,好像没有对他有过赋值之类的。还是他的根据他的默认值,但我不知道他默认值是多少?0吗?我只是想确定一下。一时间看不明白请大家帮忙.
如果需要前后段代码我可以在后面贴出。
------解决方案--------------------------------------------------------
也许lstrcpy会设置DF。但不保证这样是安全的。换句话说,这属于不严谨的代码。
本来我想说,“鄙视win32的汇编,不讨论”的。
------解决方案--------------------------------------------------------
默认是DF=0,即地址增方向,如果你在一个函数中设置了DF(STD)退出函数前一定要CLD 。所以,如果你在主函数中STD,再调用像printf之类的api,通常会崩溃。就怕别人写函数不严谨,置位了DF,之后,却没有清除该位。所以有时为了保险起见,在stos 之类指令之前加上cld等。
------解决方案--------------------------------------------------------
真想知道,直接逆api
------解决方案--------------------------------------------------------
楼上说的对应该先置位 CLD 否则谁知道ESI的生长方向是加还是减 LOASD 是直接从ESI取4字节到EAX中