当前位置:鱼C工作室 >Win32汇编 > 查看文章

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

使用MASM11(变量的使用2)

 

让编程改变世界

Change the world by program


 

变量的尺寸和数量

 

在源程序中用到变量的尺寸和数量的时候,可以用sizeof和lengthof伪指令来实现,格式是:

sizeof 变量名、数据类型或数据结构名

lengthof 变量名

 

他们的区别是:sizeof 伪指令可以取得变量、数据类型或数据结构以字节为单位的长度,然而 lengthof 则可以取得变量中数据的项数。

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

 

执行后 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 函数去计算。


为您推荐

报歉!评论已关闭.