OS/390汇编语言



  OS/390汇编和微机上的 INTEL X86 汇编在原理上是一致的,当然它们的指令集是不同的。掌握汇编语言的难度就在于对指令集的了解和使用。我也是刚刚接触大机的汇编,只好以学过的微机汇编进行类比了(待续)。

  大机汇编经常和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改成其他的数字),都不能正确引用参数区。查阅参考手册,还是很茫然,真不知道如何对待这样一个棘手的问题。


Copyright 2000-2005,zedware_at_gmail_dot_com
Last modified on Wednesday, 2004-09-08