让编程改变世界
Change the world by program
stWndClass WNDCLASS <> szHello db ‘Hello,world!’,0 dwTest dd 1,2,3,4 …… .code …… mov eax, sizeof stWndClass mov ebx, sizeof WNDCLASS mov ecx, sizeof szHello mov edx, sizeof dword mov esi, sizeof dwTest[/codesyntax] 执行后 eax 的值是 stWndClass 结构的长度:40 ebx同样是:40 ecx的值是Hello,world! 字符串的长度加上一个字节的0结束符:13 edx的值是一个双字的长度:4 esi等于4个双字的长度:16 如果把所有的 sizeof 换成 lengthof,那么eax会等于1,因为只定义了1项WNDCLASS 而ecx同样等于13 esi则等于4 lenghof WNDCLASST 和 lengthof dword 是非法的用法,编译程序会报错。 要注意的是,sizeof 和lengthof 的数值是编译时产生的,由编译器传递到指令中去,上边的指令最后产生的代码就是: mov eax, 40 mov ebx, 40 mov ecx, 13 mov edx, 4 mov esi, 16 如果为了把Hello和World分两行定义,szHello是这样定义的: szHello db ‘Hello’, odh, oah db ‘World’, 0 那么 sizeof szHello 是多少呢? 注意!是7,而不是13。MASM 中的变量定义只认一行,后一行db ‘World’, 0 实际上是另一个没有名称的数据定义,编译器认为sizeof szHello是第一行字符的数量。(尝试一下) 虽然把 szHello 的地址当参数传给 MessageBox 等函数显示时会把两行都显示出来,但严格地说这是越界使用变量。 虽然在实际的应用中这样定义长字符串的用法很普遍,因为如果要显示一屏幕帮助,一行是不够的。 但要注意的是:要用到这种字符串的长度时,千万不要用 sizeof 去表示,最好是在程序中用lstrlen 函数去计算。 [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://urlxf.qq.com/?NniEBvm']视频下载[/Downlink]