Assembly 如何检查文件路径是否存在

Assembly 如何检查文件路径是否存在,assembly,mainframe,Assembly,Mainframe,我是大会的新人;如何检查IBM大型机程序集代码中是否存在特定路径(UNIX)路径。 例如,我想检查路径“/user/lpd/file”是否存在 IBM页面上有一个例子 MVC BUFFERA(19),=CL19'labrec/qual/current' MVC BUFLENA,=F'19' SPACE ,

我是大会的新人;如何检查IBM大型机程序集代码中是否存在特定路径(UNIX)路径。 例如,我想检查路径“/user/lpd/file”是否存在

IBM页面上有一个例子

     MVC   BUFFERA(19),=CL19'labrec/qual/current'                   
     MVC   BUFLENA,=F'19'                                           
     SPACE ,                                                        
     CALL  BPX1STA,              Get file status                   +
           (BUFLENA,             Input: Pathname length            +
           BUFFERA,              Input: Pathname                   +
           STATL,                Input: Length of buffer needed    +
           STAT,                 Buffer, BPXYSTAT                  +
           RETVAL,               Return value: 0 or -1             +
           RETCODE,              Return code                       +
           RSNCODE),             Reason code                       +
           VL,MF=(E,PLIST)       ---------------------------------- 

但是仍然需要手动查找参数a的长度当我第一次开始学习HL/ASM时,我发现结合使用操作原理和C编译器清单非常方便

如果您在Unix系统服务端,则可以编写一段代码,例如

foo.c:

#include <stdlib.h>
int foo(const char* str) {
  return strlen(str);
}
#包括
int foo(常量字符*str){
返回strlen(str);
}
然后将代码编译为:

c89-c-Wc,列表(./)foo.c

然后看看编译器是如何生成代码的。 您还可以尝试使用-O2来查看优化器可能会如何操作。
小心不要让优化器“做得太多”,例如,不要让它看到实际的字符串,否则它只会在编译时计算长度,因为我注意到,从1月份开始,您还没有得到任何完整的答案

首先,如果您的目标是计算文件名的长度,以便将其作为参数传递给stat()(或BPX1STA),那么代码示例中还有一些其他问题

您认为您需要strlen()——这在汇编程序中使用zSeries“SEARCH STRING”(或SRST)指令很容易实现——但您缺少一个关键要素来实现这一点……C样式字符串可以工作,因为它们以null结尾,在您的代码中,您有:

MVC BUFFERA(19),=CL19'labrec/qual/current'

不一定有空终止符,所以strlen不会给出您期望的结果(取决于内存中这个常量后面的内容)。您已经分配了一个19个字符的字符串,它后面的任何内容都是代码中下一步内容的函数

更好的方法可能是使用更长的缓冲区进行编码,如下所示:

BUFFERA  DC 1024C' '
然后,您将被设置为处理一个序列,比如将字符串移动到此区域,并使用类似于SRST的东西计算其长度

IBM的示例没有这个问题,因为BPX1STA不需要以null结尾的字符串,所以他们跳过了动态计算长度的想法,只是显示了一个硬编码的值。如果您想让它更具动态性,您可能需要分配一个任意长的缓冲区(UNIX服务文件名可以是1024字节长),将缓冲区设置为空,复制所需的文本,然后使用SRST和少量减法获得长度。其实并不难

另一点是,很多时候,调用C-runtime函数比调用相应的BPX1更容易。。。汇编服务。在汇编程序中,挑战在于使代码保持一致性,但一旦这样做(而且很容易),就可以像C程序员那样简单地调用“stat()”。在本例中,您只需向它传递一个以null结尾的文件名和一个输出缓冲区地址,运行时函数将完成所有工作


如果您精通C,编写符合LE的汇编程序的一个简单方法是用C编写一个简短的“main()”,并让它调用您的汇编程序代码……这样,所有LE设置都会提前为您完成,而C运行时中可用的任何内容现在都可以在汇编程序中使用。另一个选择是只编码各种CEE。。。汇编代码中的宏-这也很简单

那么,您的问题是如何编码或调用
strlen
?是的,除此之外,我将使用clc RETVAL(1),=cl1'0'检查路径状态?