由于单片机缺少大型的数据存储器,所有ZJB将不使用效率低下的堆栈来传递参数,而是在片内存储器的空闲区域开辟一段内存作为过程的参数和局部变量存储区,编译器会分析所有的过程调用并计算过程所定义的参数和局部变量所需的存储空间,然后重用那些不相干存储空间,这种策略使得ZJB的资源占用显著所缩小,以节省单片机宝贵的内存资源。当然,您可以使用引用参数来引用已声明的系统变量,诸如A、Rn等,这将不占参数区任何资源并加快参数的传递。如果您想返回大量的参数,可返参数将提供这种途径。
ZJB的过程具有重载特性,这样您可以用同一个名称来声明那些意义相同,但参数类型不同或参数个数不同的过程,编译器在调用时会用分析所有的同名过程,然后使用最合适的过程来执行程序。过程的重载将有利代码的细分并提高过程的执行效率。
另外,ZJB还具有垃圾过程过滤功能,编译器在编译时会分析所有的过程调用,并标记那些垃圾过程,被标记的垃圾过程不分配任何资源,也不生成任何执行代码,所以,您在编程时可以积累一些常用的过程,并复制到您工作的程序中,因编译器的垃圾过滤功能会过滤那些垃圾,所以即是有些多余的过程,也不会影响代码的效率。
过程声明
1:声明过程名称和所需的参数,不要忘记参数要用括号括起来,最后再书写一个冒号。
过程名称(用逗号隔开的参数列表):
参数名加前缀可改变参数的种类,前缀的意义如下:
无前缀: 通用参数,只能传入数据,不改变实参的值,相对较安全
*前缀: 引用参数,传入传出数据,形参不占用任何资源,不安全
/前缀: 可返参数,传入传出数据,不安全
2:定义过程所需的局部变量,过程中定义的变量为局部变量,当过程结束时编译器将释放这些局部变量和参数变量,如果您想保持局部变量中的值不变,可使用 :::来声明,这样在:::后声明的变量就成为静态变量。假如声明的局部变量和全局变量重名,那么在过程中将会使用局部变量,这一点需用户牢记。
3:编写代码,以实现过程的功能。
4在过程结尾写一个返回语句 / ,用于结束过程。
;示例:声明一个无参xy过程
xy(): ;声明语句
:: 用逗号隔开的过程级变量列表 ;定义过程使用的局部变量
::: 声明静态变量 ;静态变量在过程结束时不释放内存空间
过程代码 ;插入过程代码,以实现过程的功能
/ ;返回语句,结束过程
;示例:声明一个有参xyz过程
xyz(*A,x"1,/y"1): ;声明语句
:: 用逗号隔开的过程级变量列表 ;定义过程使用的局部变量
过程代码 ;插入过程代码,以实现过程的功能
/ ;返回语句,结束过程
调用过程
过程调用的格式如下:过程名、参数列表必须用空格隔开,不能使用逗号,逗号为语句分隔符。
*过程名称 用空格隔开的参数列表,
注:为了可靠,返回参数在调用时需加 / 前缀,以突出这是一个返回参数。
;示例:调用有参xy过程
*xyz 10 1000 /zz, ;调用xyz过程
;参数传递过程,A=10,x=1000,y=zz,调用xyz,zz=y
过程在调用时会把调用语句后的地址进行压栈操作,以便返回,压栈操作先压入低字节地址,后压入高地址字节,如果我们修改堆栈栈顶的两个字节数据,那么过程将返回到我们需要的地方而不是返回到调用的断点处,这在一些奇思异想的程序中广为应用,ZJB由于可对堆栈进行操作,所有这些看起来不可思议的事情也变得非常轻松,在这之前,我们先熟悉堆栈操作的两个语句:
压栈语句: 变量++,
可操作: k,x, A, Rn, DP, @Ri, @@Ri, @@DP
功能:把变量内容压入堆栈,堆栈指针SP加1,压栈后对象内容不变。相当于汇编中的 PUSH。
出栈语句: 变量--,
功能:把栈顶内容弹出到变量,堆栈指针SP减1,变量中数据被替换,相当于汇编中的 POP。
有了这些,我们就实现这种需求:
--Sp,--Sp ;移动栈顶指针以修改断点地址
100H++ ;把100H地址压入堆栈
/ ;返回到100H地址处执行