汇编语言是面向机器的语言,没有对函数的定义,函数的实现是通过中断调用的,(一个代码段跳到另外一个代码段) 所以对全局变量和局部变量的体现是通过栈来实现的,即:全局变量保存在数据段中,即伪代码中声明的DATA SEGMENT,任何时刻都能调用:而局部变量则保存在栈段中,是伪代码中声明的STACK SEGMENT,平时不调用,调用中断时把局部变量从栈里取出来...
extern指的是外部变量,如在一个源程序包含两个文件,其中一个文件要引用另外一个文件的变量时就要用到extern来声明。宏定义的变量在使用时,为符号替换。
全局变量:全局变量即使你用不到她也会初始化,并占用内存空间。 全局变量的作用域是整个程序,Win32汇编的全局变量定义在.data或.data?段内,可以同时定义变量的类型和长度. 格式是: 变量名类型 初始值1, 初始值2, … 变量名 类型 重复数量 dup (初始值1, 初始值2, …) 例: .data ;全局变量的类型才可以用缩写 wHour dw ? ;未初始化的word类型变量 wMinute dw 10 ;初始化为10的word类型变量 _hWnd dd ? ;未初始化dword类型的变量 Word_Buffer dw 100 dup (1, 2) ;word类型数组,初始化0001,0002,0001,0002,… szBuffer Byte 1024 dup (?) ;byte数组,未初始化(未初始化其实就是全0值) szText db ‘Hello, World!’ ;一个字符串 ;在byte类型变量的定义中,可以用引号定义字符串和数值定义的方法混用,假设要定义两个字符串’Hello, World!’和’Hello again’,每个字符串后面跟回车和换行符,最后以一个0字符结尾. 可以如下定义: szText db ‘Hello, World!’, 0dh, 0ah, ‘Hello again’, 0dh, 0ah, 0 全局变量的定义中既可以指定初值,也可以用问号预留空间,在data?段中,只能用问号预留空间.既然可以用问号预留空间,那么这个未初始化的值是随机的还是确定的.答题是0,所以问号指定的全局变量如果要以0为初始值的话,在程序中可以不必特地为这赋值. 局部变量: 不过局部变量是在你用到的时候进行初始化,占用内存空间 局部变量的作用域是单个子程序,在进入子程序的时候,通过修改栈指针esp来预留出需要的空间,在用ret指令返回主程序之前,同样通过恢复esp丢弃这些空间,这些变量就随之无效了.它的缺点是因为空间是临时分配的,所以无法定义含有初始化值的变量,对局部变量的初始化一般在子程序中同指令完成. 定义格式: local 变量名1[[重复次数]] [:类型], 变量名2[[重复次数]] [:类型]… local伪指令必须紧接在子程序定义的伪指令proc后,其他指令开始前. 1: 可以有多个local语句. 2: 不能用类型缩写. 3: 定义结构体,可以用结构体的名称当做类型. 4: 定义dword类型的局部变量,类型可以省略 5: 定义数组时可以用[]括起来. 6: 不能使用定义全局变量的dup伪指令. 7: 不能和已经定义的全局变量重名. 8: 局部变量的起始值是随机的,所以局部变量的值一定要初始化
例: Localloc1[1024]: Byte ;1024长的字节数组 Local loc2 ;默认为dword类型的局部变量