我有一个用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完全相同的输入和输出?
1条答案
按热度按时间wnrlj8wa1#
OP中给出的示例用于无符号值(
OI
指令和PIC
子句中缺少S
)。如果将相同的UNPK
指令用于有符号值,则需要对以下内容进行调整。我还展示了与直线
MOVE
没有区别。请注意,
LINKAGE SECTION
包含MOVE
语句将使用的PICTURE
子句。使用LENGTH OF ... - 1
可确保这些picture子句与原始子句匹配。验证码:
输出:
使用UNPK程序:
使用直线
MOVE