使用MASM11(变量的使用2) Win32汇编语言019

使用MASM11(变量的使用2)

 

让编程改变世界

Change the world by program


 

变量的尺寸和数量

  在源程序中用到变量的尺寸和数量的时候,可以用sizeof和lengthof伪指令来实现,格式是: sizeof 变量名、数据类型或数据结构名 lengthof 变量名   他们的区别是:sizeof 伪指令可以取得变量、数据类型或数据结构以字节为单位的长度,然而 lengthof 则可以取得变量中数据的项数。 [codesyntax lang="asm"]
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]
原文地址:https://www.cnblogs.com/LoveFishC/p/3847138.html