繁体   English   中英

如何在大型机汇编程序中对一对具有“ +”或“-”前缀的传递值求和?

[英]How to Sum a Pair of Passed Values Having a '+' or '-' Prefix in Mainframe Assembler?

我有一个COBOL程序,该程序读取一个文件,该文件包含成对的右对齐数字值,这些字符值的字符格式最长为15位,每个值中都有一个前导符号,并且没有前导零。 例如:

     Value One         Value Two             Result 
----+----1----+----2----+----3----+----4----+----5----+
+123456789012345   -123456789012345                  0 
           -2345              +5432              +3087
      +543210987         -789012345         -245801358
+999999999999999   -888888888888888   +111111111111111

我需要一个Assembler子例程来计算这些值的总和并返回结果。 任何人都可以发布示例汇编程序子例程来执行此操作吗?

我假设这里的目标是将EBCDIC字符串转换为打包(或可能是未打包)的十进制字符串。 我还假设对于IBM大型机,您的意思是带有370/390的指令集。

假设这是家庭作业,那么您应该具有机器级压缩(或解压缩)十进制格式的文档。 对于压缩十进制,最后的“半字节”将保留“符号”。 您也可以进行网络搜索以找到文档。 由于我不确定您使用的是哪个大型机,因此建议您进行网络搜索,而不要发布可能无助的链接。

我不确定这是否是一个问题,但是如果您需要的指令具有固定值操作数(例如字符串大小),并且您需要将其设为变量,请使用execute指令以变量操作数覆盖该固定值操作数。

要将打包的十进制转换回EBCDIC,请使用编辑和标记类型指令。 我不记得EBCDIC用什么包装小数。

解:

SAMPLE  CSECT 
        SAVE (14,12)        SAVE CALLER REGS 
        LR   12,15          R12 = BASEREG 
        USING SOSAMP,12 
        SR   2,2            R2 = 0 
        LM   3,5,0(1)       R3->NUM1,R4->NUM2,R5->ACCUM OUT 
        LM   6,9,0(3)       SAVE NUM1 CHARS IN R6-R9 
* 
        TRT  0(16,3),HEXTBL FIND THE '+' OR '-' CHAR IN NUM1 
        MVI  0(1),X'40'     OVERLAY WITH SPACE 
        EX   2,SIGN1        SET NUM1 SIGN ACCORDING TO '+' OR '-' 
* 
        TRT  0(16,4),HEXTBL FIND THE '+' OR '-' CHAR IN NUM2
        MVI  0(1),X'40'     OVERLAY WITH SPACE 
        EX   2,SIGN2        SET NUM2 SIGN ACCORDING TO '+' OR '-' 
* 
        PACK 8(8,3),0(16,3) PACK NUM1 
        PACK 0(8,3),0(16,4) PACK NUM2 
        LA   0,C'+'         R0 = C'+' (ASSUMES POSITIVE RESULT)  
        AP   0(8,3),8(8,3)  SUM NUM1 + NUM2 
        BNM  GOEDMK         IF POSITIVE, GO 
        LA   0,C'-'         ELSE R0 = C'-' 
GOEDMK  MVC  0(16,5),EDPAT  MOVE EDIT PATTERN TO RESULT 
        EDMK 0(16,5),0(3)   EDIT AND MARK RESULT 
        BZ   RETURN         IF ZERO, RETURN   
        BCTR 1,0            ELSE R1 MINUS 1 
        STC  0,0(1)         STORE SIGN OF RESULT 
RETURN  SR   15,15          SET RETURN CODE = ZERO 
        STM  6,9,0(3)       RESTORE NUM1 CHARS FROM R6-R9 
        RETURN (14,12),RC=(15) RETURN 
SIGN1   NI   15(3),X'00' 
SIGN2   NI   15(4),X'00' 
EDPAT   DC   X'40202020202020202020202020202120' 
HEXTBL  DC   256X'00' 
        ORG  HEXTBL+C'+' 
        DC   X'CF' 
        ORG  HEXTBL+C'-' 
        DC   X'DF' 
        ORG 
        END  

一个用于测试的COBOL“驱动程序”程序:

IDENTIFICATION DIVISION.                      
PROGRAM-ID. SAMPLEC.                          
ENVIRONMENT DIVISION.                         
INPUT-OUTPUT SECTION.                         
FILE-CONTROL.                                 
    SELECT INFILE ASSIGN INFILE.              
    SELECT OUTFILE ASSIGN OUTFILE.            
DATA DIVISION.                                
FILE SECTION.                                 
FD OUTFILE RECORDING MODE F.                  
01  OUTREC.                                    
    05 PIC X(38).                             
    05 RSLT PIC X(16).                        
FD  INFILE RECORDING MODE F RECORD CONTAINS 0. 
01  INREC.                                    
    05 NUM1 PIC X(16). 05 PIC X(3).           
    05 NUM2 PIC X(16). 05 PIC X(3).           
    05 PIC X(16).                             
WORKING-STORAGE SECTION.                      
01. 05 SAMPLE PIC X(8) VALUE 'SAMPLE'.        
    05 PIC X VALUE 'N'. 88 EOF VALUE 'Y'.                                          
    05 HEADING1 PIC X(52) VALUE                                  
       '     Value One         Value Two             Result'.    
    05 HEADING2 PIC X(55) VALUE                                  
       '----+----1----+----2----+----3----+----4----+----5----+'.
PROCEDURE DIVISION.                                              
    OPEN INPUT INFILE OUTPUT OUTFILE                             
    WRITE OUTREC FROM HEADING1                                   
    WRITE OUTREC FROM HEADING2                                   
    PERFORM READ-INFILE                                          
    PERFORM UNTIL EOF                                            
      MOVE INREC TO OUTREC                                       
      CALL SAMPLE USING NUM1, NUM2, RSLT                         
      WRITE OUTREC                                               
      PERFORM READ-INFILE                                        
    END-PERFORM                                                  
    GOBACK.  
READ-INFILE. READ INFILE AT END SET EOF TO TRUE END-READ.   

和一些JCL来运行COBOL驱动程序:

//<jobname> JOB                                         
//JOBLIB DD DISP=SHR,DSN=<sample load library>          
// EXEC PGM=SAMPLEC    
//OUTFILE DD SYSOUT=*                                 
//INFILE DD *                                          
+123456789012345   -123456789012345  
           -2345              +5432  
      +543210987         -789012345  
+999999999999999   -888888888888888  
/*                                                     
//

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM