[英]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.