-
- .386
- .model flat,stdcall
- option casemap:none
-
- .data
- sum DWORD 0 ;创建一个全局变量,取名sum,初始化0
- sum1 DWORD ? ;创建一个全局变量sum1,无初始化
- ;问号(?)初始化值使得变量未被初始化,这意味着在运行时才会为该变量分配一个值
- ;变量名其实是一个标号,标识了从该变量从所在段的开始到该变量的偏移量
-
- list BYTE 10,20,30,40
- BYTE 50,60,70,80
- BYTE 81,82,83,84
-
- ;如果同一个数据定义中使用了多个初始化值,则它的标号只指出第一个初始化值的偏移量
- ;假设list的偏移量为0000,那么数值10的偏移量就为0000,20的偏移量为0001,30的偏移量为0002,40的偏移量为0003
- ;不是所有的数据定义都需要标号。比如, 要在list字节数组后面继续扩展,就可以在下一行定义后加的字节:
- ;BYTE 50, 60, 70, 80 BYTE 81, 82, 83, 84
-
-
- ExitProcess PROTO,dwExitCode:DWORD
-
- .code
- main PROC
- mov eax,5
-
- mov sum,eax
-
- INVOKE ExitProcess,0
- main ENDP
- END main
-
-
-
- .data
- val1 DWORD 12345678h ;无符号数
- val2 SDWORD -2147483648 ;有符号数
- val3 DWORD 20 DUP(?) ;无符号数组
-
- val4 DD 12345678h ;无符号数
- val5 DD -2147483648 ;有符号数
-
-
- pVal DWORD val3
- ;DWORD还可用于声明一种变量, 这种变量包含的是另一个变量的32位偏移量。如上所示, pval包含的就是val3的偏移量
-
- myList DWORD 1, 2, 3, 4, 5 ;定义数组,偏移量的增量为4
-
Intel将一个压缩的BCD整数存放在一个10字节的包中。每个字节(除了最高字节外)包含两个十进制数字。在低9个字节中,每半个字节都存放了一个十进制数字。在最高字节中,最高位表示该数的符号。如果最高字节为80h,则该数为负数;如果最高字节为00h,则该数为正数。整数的范围是-999999999999999999到+999999999999999999。与其他数据值一样, BCD以小端序存储(最低字节存放在变量的起始偏移量处) 。
MASM使用T BYTE伪指令来声明压缩BCD变量。常量初始化值必须是十六进制的, 因为汇编器不会自动将十进制初始化值转换为BCD码。下面的两个例子展示了十进制数-1234有效和无效的表达方式:
- .data
- rVal1 REAL4 -1.2
- rVal2 REAL8 3.2E-260
- rVal3 REAL10 4.6E+4096
- ShortArray REAL4 20 DUP(0.0)
-
- ;DD、DQ和DT伪指令也可以定义实数:
- rVal4 DD -1.2 ;短实数
- rVal5 DQ 3.2E-260 ;长实数
- rVal6 DT 4.6E+4096 ;扩展精度实数
-
-
- .386
- .model flat,stdcall
- option casemap:none
-
- .data
- firstval DWORD 20002000h
- secondval DWORD 11111111h
- thirdval DWORD 22222222h
- sum DWORD 0
-
- ExitProcess PROTO,dwExitCode:DWORD
-
- .code
- main PROC
- mov eax,firstval
- add eax,secondval
- add eax,thirdval
- mov sum,eax
-
- INVOKE ExitProcess,0
- main ENDP
- END main
-
.data?伪指令声明未初始化变量。当定义大量未初始化变量时, .data?伪指令减少了编译后程序的大小。例如,下述代码是高效率的声明:
- .data? ;声明未初始化数据
- bigArray DWORD 5000 DUP(?) ;20000个字节,未初始化
全局变量的作用域是整个程序, Win32汇编的全局变量定义在.data或.data?段内
数据类型只有定义全局变量时才可以缩写
全局变量在定义中既可以指定初值, 也可以只用问号预留空间, 在.data?段中, 只能用问号预留空间, 因为.data?不能指定初始值, 这里就有一个问题:既然可以用问号预留空间,那么在实际运行的时候,这个未初始化的值是随机的还是确定的呢?答案是0,所以用问号指定的全局变量如果要以0为初始值的话,在程序中可以不必特地为它赋值
MASM用local伪指令提供了对局部变量的支持。定义的格式是:
local伪指令必须紧接在子程序定义的伪指令proc后、其他指令开始前
在一个local语句定义不下的时候, 可以有多个local语句, 语法中的数据类型不能用缩写
当定义数组的时候, 可以[] 括号括起来, 不能使用定义全局变量的dup 伪指令。
局部变量不能和已定义的全局变量同名。
局部变量的作用域是当前的子程序,所以在不同的子程序中可以有同名的局部变量。
-
- .386
- .model flat,stdcall
- option casemap:none
- .stack 4096
-
- .data
-
- ExitProcess PROTO,dwExitCode:DWORD
-
- .code
-
- TestProc Proc dwParam1:DWORD
- local loc1:dword ;用local语句定义了1个局部变量:@loc1是dword类型
-
- mov eax, dwParam1 ;把参数值给eax
- mov loc1,eax ;把eax值传递给局部变量
-
-
- ret
- TestProc endp
-
-
-
- main PROC
-
- invoke TestProc,10101010h
-
-
-
- INVOKE ExitProcess,0
- main ENDP
- END main