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

时间:2019-01-21 16:36:58

标签: assembly mainframe

我是新来的集会;如何从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的长度

2 个答案:

答案 0 :(得分:0)

当我第一次学习HL / ASM时,发现结合使用“操作原理”和C编译器清单很方便。

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

foo.c:

#include <stdlib.h>
int foo(const char* str) {
  return strlen(str);
}

,然后将该代码编译为:

c89 -c -Wc,list(./)foo.c

,然后查看编译器如何生成代码。 您也可以尝试使用-O2来查看优化器如何执行此操作。 注意不要使优化器“做太多”,例如不要让它看到实际的字符串,否则只会在编译时计算长度

答案 1 :(得分:0)

这里有几点,我注意到自从一月份以来您还没有完整的答案...

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

您认为您想要strlen()-使用zSeries“ SEARCH STRING”(或SRST)指令在汇编程序中实现起来很容易-但您缺少使它起作用的关键要素... C风格字符串之所以有效,是因为它们以空值结尾,并且在您的代码中,您可以找到:

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

不一定有一个空终止符,因此strlen不会给您期望的结果(取决于此常量在内存中的作用)。您已经分配了一个19个字符的字符串,其后的内容都是代码接下来的功能。

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

BUFFERA  DC 1024C' '

然后,您将被设置为处理一个序列,例如将字符串移至该区域并使用SRST之类的值计算其长度。

IBM的示例没有此问题,因为BPX1STA不需要以null结尾的字符串,因此他们跳过了动态计算长度的想法,只显示了一个硬编码值。如果要使其更具动态性,则可能需要执行一些操作,例如分配任意长的缓冲区(UNIX Services文件名可以为1024字节长),将缓冲区设置为null,复制所需的文本-然后您可以用SRST加上一点减法得到长度。这并不难。

另一点是,与相应的BPX1 ...汇编器服务相比,调用C运行时函数通常要容易得多。在汇编程序中,挑战在于使代码符合LE,但是一旦做到这一点(这很容易),就可以像C程序员一样简单地调用“ stat()”。在这种情况下,只需向其传递一个以空值结尾的文件名和一个输出缓冲区地址,然后运行时函数将完成所有工作。

如果您精通C语言,编写符合LE标准的汇编器的一种简单方法是在C语言中编写一个简短的“ main()”,然后让它调用您的汇编代码...这样,所有LE设置已经为您预先完成了,现在C运行时中可用的所有内容都可以在汇编器中使用。另一个选择是只在汇编代码中编码各种CEE ...宏-这也非常简单。