我是新来的集会;如何从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的长度
答案 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 ...宏-这也非常简单。