变量的使用
变量的使用:
1.以不同的类型访问变量:
先定义一个缓冲区:
szBuffer db 1024 dup (?)
如果mov ax,szBuffer 就会报错,因为szBuffer是用db定义的,而ax是word,尺寸不合,解决办法用ptr
mov ax,word ptr szBuffer
mov eax,dword ptr szBuffer
这样就可以。
想要强制类型转换,就可以用MOVZX或MOVSX。前者不带符号,后者带符号。
如: movzx ax,bTest1 ;把单字节变量bTest1的值扩展到16位放入ax中。
movzx eax,bTest1 ;把单字节变量bTest1的值扩展到32位放入eax中。
2.变量的尺寸和数量:
sizeof获取变量,数据类型或数据结构以字节为单位的长度,lengthof获取变量中数据的项数。
如:定义了以下数据
stWndClass WNDCLASS <>
szHello db 'Hello,world!',0
dwTest db 1,2,3,4
mov eax,sizeof stWndClass ;eax是40,stWndClass结构的长度
mov ebx,sizeof WNDCLASS ;ebx是40,WNDCLASS结构的长度
mov ecx,sizeof szHello ;ecx是13,'Hello,world!'字符串长度加上一个字节的0结束符
mov edx,sizeof dword ;edx是4,双字的长度
mov esi,sizeof dwTest ;esi是16,4个双字的长度
要注意的是,sizeof 和 lengthof 的数值是编译时候产生的,所以最后产生的代码是:
mov eax,40
mov ebx,40
mov ecx,13
mov edx,4
mov esi,16
3.获取变量地址
取全局变量:如: mov eax, offset WndClass
取局部变量:用ebp来做指针操作。
如果要在invoke伪指令的参数中用到一个局部变量的地址,就用addr
1.以不同的类型访问变量:
先定义一个缓冲区:
szBuffer db 1024 dup (?)
如果mov ax,szBuffer 就会报错,因为szBuffer是用db定义的,而ax是word,尺寸不合,解决办法用ptr
mov ax,word ptr szBuffer
mov eax,dword ptr szBuffer
这样就可以。
想要强制类型转换,就可以用MOVZX或MOVSX。前者不带符号,后者带符号。
如: movzx ax,bTest1 ;把单字节变量bTest1的值扩展到16位放入ax中。
movzx eax,bTest1 ;把单字节变量bTest1的值扩展到32位放入eax中。
2.变量的尺寸和数量:
sizeof获取变量,数据类型或数据结构以字节为单位的长度,lengthof获取变量中数据的项数。
如:定义了以下数据
stWndClass WNDCLASS <>
szHello db 'Hello,world!',0
dwTest db 1,2,3,4
mov eax,sizeof stWndClass ;eax是40,stWndClass结构的长度
mov ebx,sizeof WNDCLASS ;ebx是40,WNDCLASS结构的长度
mov ecx,sizeof szHello ;ecx是13,'Hello,world!'字符串长度加上一个字节的0结束符
mov edx,sizeof dword ;edx是4,双字的长度
mov esi,sizeof dwTest ;esi是16,4个双字的长度
要注意的是,sizeof 和 lengthof 的数值是编译时候产生的,所以最后产生的代码是:
mov eax,40
mov ebx,40
mov ecx,13
mov edx,4
mov esi,16
3.获取变量地址
取全局变量:如: mov eax, offset WndClass
取局部变量:用ebp来做指针操作。
如果要在invoke伪指令的参数中用到一个局部变量的地址,就用addr