z/OS UNIX System Services环境下汇编程序如何获取命令行参数?
z/OS UNIX System Services 汇编程序命令行参数的存储位置
在z/OS UNIX System Services(USS)环境下,当你通过mypgm p1 p2运行汇编程序时,命令行参数并非直接存放在R1寄存器中,R1实际指向一个参数信息块(Parameter Information Block, PIB),所有参数的元数据都通过这个结构来访问。
PIB结构说明
PIB是固定格式的控制块,核心字段如下:
PIB DSECT PIBARGCN DS F ; 参数总个数(包含程序名,示例中为3:mypgm、p1、p2) PIBARGVP DS F ; 指向参数向量表的指针 PIBENVP DS F ; 指向环境变量表的指针 PIBEND DS 0F
参数的实际存储
参数向量表是连续的地址数组,每个元素是一个指针,指向以null(X'00')结尾的字符串:
- 第一个指针指向程序名
mypgm的字符串 - 第二个指针指向参数
p1 - 第三个指针指向参数
p2
汇编代码示例(获取参数)
以下是一段简单的汇编代码,演示如何读取p1和p2:
MYPGM CSECT STM R14,R12,12(R13) ; 保存调用者寄存器 LR R12,R15 ; 设置基址寄存器 USING MYPGM,R12 LA R13,SAVEAREA ; 建立保存区 ST R13,4(R1) ST R1,8(R13) * 从PIB获取参数信息 L R2,PIBARGCN(R1) ; R2 = 参数总个数(示例中为3) L R3,PIBARGVP(R1) ; R3 指向参数向量表 * 读取第一个参数p1(跳过程序名,取向量表第二个元素) L R4,8(R3) ; R4 指向p1的字符串地址 * 这里可添加字符串处理逻辑(如打印、解析等) * 读取第二个参数p2 L R5,12(R3) ; R5 指向p2的字符串地址 * 程序退出 L R14,12(R13) ; 恢复寄存器 LM R0,R12,20(R13) BR R14 ; 返回系统 SAVEAREA DS 18F ; 标准寄存器保存区 PIB DSECT PIBARGCN DS F PIBARGVP DS F PIBENVP DS F END MYPGM
关键注意点
- 参数个数包含程序名本身,所以
mypgm p1 p2的参数总数是3,而非2。 - 所有参数字符串以null结尾,遵循POSIX规范,与TSO/批处理环境的参数传递机制完全不同。
- 若你之前尝试直接从R1读取参数失败,大概率是混淆了USS与TSO环境的参数传递逻辑。
内容的提问来源于stack exchange,提问作者mike
相关产品推荐
相关产品推荐

