首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

读老罗WIN32疑问.解决方案

2012-05-04 
读老罗WIN32疑问.这个疑问在书中的P171页Assembly code.ifax IDOK如果点击查看invokeSendDlgItemMessag

读老罗WIN32疑问.
这个疑问在书中的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中

热点排行