assembly 如何在COBOL中执行变长UNPK指令(IBM大型机ASM)?

m2xkgtsf  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(117)

我有一个用ASM编写的遗留代码,需要转换为COBOL。
ASM代码如下:

EX    R8,UNPK1
         OI    UNWK16+15,X'F0'

UNPK1    UNPK  UNWK16(16),0(0,R4)
UNWK16   DC    CL16' '

寄存器R4以Packed格式存储内容的地址,长度在R8中定义。
例如,如果R4存储内容“123 C”的地址(2个字节),则R8存储1(2个字节减1)。
上面的代码相当于

UNPK    UNWK16(16),0(2,R4)

此命令的执行结果为'000000000000123'。
如果R4存储内容“12345 C”的地址(3字节),则R8存储2(3字节减1)。
上面的代码相当于

UNPK    UNWK16(16),0(3,R4)

此命令的执行结果为'000000000012345'。
现在我需要将上面的代码转换为COBOL。
在COBOL中,从PACKED十进制到字符串的转换是自动的。

01 TEST PIC 9(8) COMP-3 VALUE 123.
01 TEST-PATTERN PIC 9(16).
01 TEST-STRING PIC X(16).

MOVE TEST TO TEST-PATTERN. 
MOVE TEST-PATTERN TO TEST-STRING.

上面的命令会将'000000000000123'存储到TEST-STRING中。
但是,我无法找到一种方法来精确定义压缩十进制背后的实际数据长度。
例如,一种方式可以是,

01 R4                PIC X(16) VALUE X'123C'.
 01 R4-1  REDEFINES R1 PIC 9(1) COMP-3.
 01 R4-2  REDEFINES R1 PIC 9(2) COMP-3.
 ...
 01 R4-16 REDEFINES R1 PIC 9(16) COMP-3.

这实际上不起作用,因为我不能确保9(3)COMP-3正好是2个字节,而9(5)COMP-3正好是3个字节。
有没有一种方法可以用COBOL编写它,并使用与ASM完全相同的输入和输出?

wnrlj8wa

wnrlj8wa1#

  • 问:有没有一种方法可以用COBOL编写与ASM完全相同的输入和输出?*

OP中给出的示例用于无符号值(OI指令和PIC子句中缺少S)。如果将相同的UNPK指令用于有符号值,则需要对以下内容进行调整。
我还展示了与直线MOVE没有区别。
请注意,LINKAGE SECTION包含MOVE语句将使用的PICTURE子句。使用LENGTH OF ... - 1可确保这些picture子句与原始子句匹配。
验证码:

PROGRAM-ID. EX-UNPK.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  TEST-DATA COMP-3.
           03 FLD-1 PIC 9(1) VALUE 1.
           03 FLD-3 PIC 9(3) VALUE 123.
           03 FLD-5 PIC 9(5) VALUE 12345.
           03 FLD-7 PIC 9(7) VALUE 1234567.
           03 FLD-9 PIC 9(9) VALUE 123456789.
      * RESULT FIELD
       01  UNWK16 PIC 9(16).
      * SIMULATE USING R4 AS THE ADDRESS OF THE SOURCE
       01  R4-PTR USAGE POINTER.
      * SIMULATE USING R8 AS THE LENGTH VALUE FOR 'EX UNPK'
       01  R8 COMP PIC S9(8).
       LINKAGE SECTION.
       01  UNPK-1 COMP-3 PIC 9(1).
       01  UNPK-3 COMP-3 PIC 9(3).
       01  UNPK-5 COMP-3 PIC 9(5).
       01  UNPK-7 COMP-3 PIC 9(7).
       01  UNPK-9 COMP-3 PIC 9(9).
       PROCEDURE DIVISION.
       BEGIN.
      * USING UNPK PROCEDURE FOR 'EX UNPK ...'
           SET R4-PTR TO ADDRESS OF FLD-1
           COMPUTE R8 = LENGTH OF FLD-1 - 1
           PERFORM UNPK
           DISPLAY UNWK16

           SET R4-PTR TO ADDRESS OF FLD-3
           COMPUTE R8 = LENGTH OF FLD-3 - 1
           PERFORM UNPK
           DISPLAY UNWK16

           SET R4-PTR TO ADDRESS OF FLD-5
           COMPUTE R8 = LENGTH OF FLD-5 - 1
           PERFORM UNPK
           DISPLAY UNWK16

           SET R4-PTR TO ADDRESS OF FLD-7
           COMPUTE R8 = LENGTH OF FLD-7 - 1
           PERFORM UNPK
           DISPLAY UNWK16

           SET R4-PTR TO ADDRESS OF FLD-9
           COMPUTE R8 = LENGTH OF FLD-9 - 1
           PERFORM UNPK
           DISPLAY UNWK16

           DISPLAY SPACE
      * STRAIGHT MOVE
           MOVE FLD-1 TO UNWK16
           DISPLAY UNWK16

           MOVE FLD-3 TO UNWK16
           DISPLAY UNWK16

           MOVE FLD-5 TO UNWK16
           DISPLAY UNWK16

           MOVE FLD-7 TO UNWK16
           DISPLAY UNWK16

           MOVE FLD-9 TO UNWK16
           DISPLAY UNWK16

           GOBACK
           .
       UNPK.
           EVALUATE R8
           WHEN 0
               SET ADDRESS OF UNPK-1 TO R4-PTR
               MOVE UNPK-1 TO UNWK16
           WHEN 1
               SET ADDRESS OF UNPK-3 TO R4-PTR
               MOVE UNPK-3 TO UNWK16
           WHEN 2
               SET ADDRESS OF UNPK-5 TO R4-PTR
               MOVE UNPK-5 TO UNWK16
           WHEN 3
               SET ADDRESS OF UNPK-7 TO R4-PTR
               MOVE UNPK-7 TO UNWK16
           WHEN 4
               SET ADDRESS OF UNPK-9 TO R4-PTR
               MOVE UNPK-9 TO UNWK16
           END-EVALUATE
           .

输出:
使用UNPK程序:

0000000000000001
0000000000000123
0000000000012345
0000000001234567
0000000123456789

使用直线MOVE

0000000000000001
0000000000000123
0000000000012345
0000000001234567
0000000123456789

相关问题