为何含空格的PIC 9变量执行ADD未触发ABEND S0C7?
疑问:COBOL ADD指令为何未触发S0C7异常?
我原本以为下面这段COBOL程序中的ADD指令会触发ABEND S0C7异常,但程序却正常终止,输出结果也出乎意料。
JCL的SYSIN配置
//SYSIN DD * 5 //* 这里仅包含字符5(后续跟着换行符)
COBOL程序代码
WORKING-STORAGE SECTION. 77 X PIC 9(10). PROCEDURE DIVISION. ACCEPT X * 此加法操作未触发ABEND S0C7异常 ADD 1 TO X DISPLAY 'X = ' X STOP RUN .
程序输出结果
X = 5000000001
调试器运行观察结果
ACCEPT语句将'5'存入X的最左侧字符位,其余右侧9个字符位为空格。ACCEPT执行后X的内容详情如下:
'5 ' <-- X的10个字符内容 0987654321 <-- 为便于理解标注的字节序号
我曾怀疑调试器显示有误,把0显示成了空格,但实际检查X的内存后确认,剩余9个字节的值确实是0x40(即EBCDIC编码的空格字符)。
初始查看的伪汇编代码
最初未复制工作机器上的准确输出,以下是伪汇编代码:
* ADD 1 TO X PACK XP, X * 将X压缩到XP AP XP, ONEP * XP 加 1 UNPK XP, X * 将XP解压缩回X
- ONEP是存储压缩格式数值1的内存地址。
疑问:我忽略了什么?
希望能得到解答,感谢帮助。
编辑补充(2月26日):获取到准确的汇编代码
周一上午,我拿到了工作机器上的准确汇编代码:
* ADD 1 TO X PKA 672(R13),152(10,R9) PACK ASCII Y,X AP 682(6,R13),1072(1,R13) ADD PACKED Y,1 UNPK 152(10,R9),682(6,R13) UNPACK X,Y OI 161(,R9),X'F0'
同时确认编译时使用了**ZONEDATA(NOPFD)**编译器选项。
内容的提问来源于stack exchange,提问作者Itsbananas
相关产品推荐
相关产品推荐

