求z/OS平台可重入HL/ASM Hello World示例(基于BPX1WRT)
可重入z/OS HL/ASM Hello World(基于BPX1WRT)
以下是符合可重入要求、使用BPX1WRT(POSIX write服务)向stdout输出的Hello World示例,规避了WTO控制台输出的限制:
TITLE 'REENTRANT HELLO WORLD VIA BPX1WRT' REENTRANT,CSECT=YES ; 声明程序可重入,代码段设为只读 HELLO CSECT USING HELLO,R12 ; 建立基址寄存器关联 STM R14,R12,12(R13) ; 保存调用者寄存器组 LR R12,R15 ; 初始化基址寄存器 LA R15,SAVEAREA ; 指向本地保存区 ST R15,8(R13) ; 将保存区链入调用链 LR R13,R15 ; 更新保存区指针 * 准备BPX1WRT调用参数 LA R1,MSGBUF ; R1: 输出缓冲区地址(只读常量) LA R2,MSGLEN ; R2: 输出字节长度 LA R3,1 ; R3: 文件描述符(1对应stdout) CALL BPX1WRT,(R1,R2,R3),VL ; 调用POSIX write服务 * 恢复寄存器并返回 LM R14,R12,12(R13) ; 恢复调用者寄存器 L R13,4(R13) ; 恢复上一级保存区指针 BR R14 ; 返回调用环境 * 只读常量数据(放在代码段,无修改操作) MSGBUF DC C'Hello, z/OS HL/ASM!' DC X'0A' ; 换行符(ASCII) MSGLEN EQU *-MSGBUF ; 自动计算消息长度 SAVEAREA DS 18F ; 标准寄存器保存区 END HELLO
可重入设计关键说明
- 只读代码段:通过
REENTRANT,CSECT=YES告知编译器将代码和只读数据标记为不可修改,完全符合z/OS可重入程序定义 - 无代码段修改:所有数据均为只读常量,程序运行过程中不会修改任何代码段内容
- 标准寄存器管理:采用z/OS标准保存区处理寄存器,避免依赖非可重入的存储逻辑
编译链接提示
- 编译:使用HLASM编译器,指定
REENTRANT选项 - 链接:使用IEWL链接器,指定
RENT选项,确保生成可重入的可执行模块
内容的提问来源于stack exchange,提问作者mike
相关产品推荐
相关产品推荐

