OS/390汇编语言
大机汇编经常和CICS一块使用,需要注意的是,如果在汇编程序中嵌入了CICS命令,有些寄存器就不能在汇编中使用了。在IBM提供的手册《CICS应用编程参考》的"附录C-CICS命令的翻译代码"中提到:
第一、对嵌入CICS的汇编程序的调用遵循以下约定:在进入程序时,寄存器1、15、14、13被占用。
1、寄存器1记录参数列表,至少包括两部分--EIB(EXEC Interface Block)地址,COMMAREA地址,如果COMMAREA不存在,则为X'00000000'。
2、寄存器15记录入口点地址。
3、寄存器14记录返回点地址。
4、寄存器13记录保存区地址。
第二、宏DFHECALL占用了寄存器15、14、1、0。
注意0号寄存器也被占用,手册说其内容没有定义,但最好不要使用它。
最近,我就是因为没有经验,使用了寄存器0作为循环变量,结果导致程序异常终止,追了半天才发现为了调试而插入的CICS命令执行后,寄存器0的值变了。系统一共只有16个寄存器,嵌入CICS会占用4、5个,只好不停的压栈、弹栈了。
OS/390汇编中,单个寄存器的寻址范围在4096字节以内,如果代码段大于4K,则需要多余一个的代码寄存器来进行指令寻址。这可以容易的用CODEREG(3,4)等方法做到,然而,要是通讯参数区大于4K,就很麻烦了。假设某个COBOL程序将调用该汇编程序,而由于设计上的问题,参数区必须大于4K,采用类似上述代码段的方法将不再奏效。比如定义了如下的参数区:
XYZDATA DSECT *
USING *,R8
将上述的“USING *,R8”改成“USING *,R8,R9”,然后在“L R8,DFHEICAP”之后加上“L R9,DFHEICAP+4096”(或将4096改成其他的数字),都不能正确引用参数区。查阅参考手册,还是很茫然,真不知道如何对待这样一个棘手的问题。