问题标签 [metalc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
1372 浏览

c - 在 Metal C 中使用 WTO 进行打印

我正在尝试使用 Metal C 中的 WTO 指令将“Hello World”打印到我的工作日志中。这是基于 z/OS V1R10.0 Metal C Programming Guide and Reference 的第 1.2.3.5 节中的示例当我使用 WTO 时出现的问题是我的缓冲区包含 0 或 ASCII 到 EBCDIC 转换。我在下面粘贴了我的工作日志的相关部分,然后是我的代码,然后是我无法编译的 IBM 示例中的代码。作业日志

我的代码

IBM 代码

0 投票
4 回答
1321 浏览

c - Metal C中的memset问题

我正在尝试使用以下代码初始化 Metal C 环境,但在 memset 行上出现以下错误。ERROR CCN3275 IMIJWS0.METAL.SAMPLIB(MEM):6 遇到意外的文本')'。错误 CCN3045 IMIJWS0.METAL.SAMPLIB(MEM):6 未声明的标识符 ___MEMSET。ERROR CCN3277 IMIJWS0.METAL.SAMPLIB(MEM):6 语法错误:可能缺少 ')' 或 ','?CCN0793(I) 文件编译失败 //'IMIJWS0.METAL.SAMPLIB(MEM)'。未创建目标文件。下面是我的代码

0 投票
1 回答
139 浏览

c-preprocessor - 如何在 C 预处理器中参数化包含 # 的单个字符串?

我想为 IBM Metal C Prolog 创建参数化预处理器宏。

最初的未参数化形式是 #pragma prolog(Foo, " #MCPROLG MAIN=(YES,16,132)") 真正的序言更复杂,但为了这个问题,重要的部分是字符串中有值。

#pragma指令本身不能成为宏的一部分,因此我将其替换为_Pragma_Pragma("prolog(Foo, \" #MCPROLG MAIN=(YES,16,132)\")")

我可以像这样参数化 Foo :

如何创建参数化值 16 的宏?

看来我需要在预处理器中连接字符串,我尝试了以下方法。都使用这个字符串化宏:

  1. 替换为 16 的标记(让我们命名它size)不能在字符串本身内,因此它会被替换。

    #define PROLOG(function, size) _Pragma(STR(prolog( function , "#MCPROLG MAIN=(YES, size ,132)")))

  2. _Pragma 只接受一个字符串,所以我不能像这样细读 C 字符串连接:

    #define PROLOG(function, size) _Pragma(STR(prolog( function , " #MCPROLG MAIN=(YES," #size ",132)")))

  3. 我不能像这样对 prolog 的整个第二个参数进行字符串化:

    #define PROLOG(function, size) _Pragma(STR(prolog( function , STR( #MCPROLG MAIN=(YES, size ,132)))))

因为#MCPROLG需要保留在字符串中,以便其 # 不被视为字符串化标记。

0 投票
1 回答
76 浏览

zos - 参数传递——非标准联动

我是一名长期的汇编程序员,正在进入 Metal C 的世界。我是一个 C 新手,所以我的术语可能反映了我所知道的东西与我正在学习的东西。它肯定会影响我对事物的理解。

我正在尝试将新的 Metal C 代码插入到一些不一定遵循标准条目链接约定的旧组件中。

例如,服务例程将要处理的控制块的地址作为 R1 中的输入。我在关于参数传递的讨论和语言参考中的#pragma 链接讨论中查看了 Metal C 用户指南,似乎没有办法让编译器这样做。

本质上,我想声明一个由以下汇编程序调用的例程:

我意识到我可以采用上述方法,对其进行参数化并将其放入 __asm() 块中,但我希望程序尽可能“干净”。

谢谢,斯科特

附录 - 2019 年 9 月 26 日

为了回应 Mark Hiscock 在下面的回答,这样的 __asm() 块看起来像:

并且处理起来会简单得多(指令更少,没有绑定时间问题)。我真的在寻找能让编译器“做正确的事”的东西。

斯科特

0 投票
1 回答
139 浏览

xlc - 我该如何使用#include 来完成这项工作?直接放入代码中时效果很好

我有一个代码块,我想在我的 z/OS Metal C 程序中#include,当它只是程序的一部分时它工作正常,但是当我将它放入 .h 文件并#include 它时,代码赢了不编译。

我已经成功地让这段代码在没有#include 的情况下工作。我确定我忽略了与#include 相关的内容...

此代码有效:

给出如下所示的编译器输出:

但是,当我将代码放入这样的#include 文件时:

并将其包含在我的 Metal C 程序中:

我收到一堆错误消息:

0 投票
1 回答
239 浏览

c - 试图在 z/OS HLASM 和 XL C/C++ 金属 C 编译器之间制作“双语宏”

我试图弄清楚如何在单个数据集/文件中包含相同 DSECT/struct 的 HLASM 和 Metal C 定义。

在尝试此操作之前,我尝试了我在如何使用#include 进行这项工作中描述的内容?直接放入代码中时效果很好

所以,我走了另一条路,并想我可以使用#define 将汇编器中的 MACRO 语句更改为 C 编译器将使用的内容:

  • 将“宏”更改为“#pragma margins(2,72)”
  • 将“MEND”更改为“#pragma nomargins”

    /li>

而且我认为我可以使用#define 将“MACRO”和“MEND”更改为 C 编译器想要的内容,首先我尝试不使用引号:

这没有产生预期的结果:

然后我尝试将#define 值括在引号中:

这提供了更少的错误消息,但仍然不是我需要的。

注意:我使用的 # 是 EBCDIC 7B。

错误消息的描述相当简洁:

CCN3191 字符 &1 不是有效的 C 源字符。说明 有关有效字符的信息,请参阅 C/C++ 语言参考。

在消息文本中:

&1 是一个字符。

用户响应 更改字符。

我参考了 C/C++ 语言参考,但找不到任何说明我不能在#define 中使用“#”的内容。事实上,关于 # 和 ## 运算符有一些话......

有没有办法解决这个问题?

谢谢,斯科特

0 投票
1 回答
93 浏览

zos - IBM z/OS Metal C - 我可以创建一个包含 #pragma 语句的 #define 宏吗?

-- 更新 20200114:#define Entry 宏和新结果的新版本

另一个新手问题在这里。我正在尝试创建一个#define 宏,我可以使用它来生成例程的条目以及它的#pragma prolog() 和#pragma epilog():

我尝试了以下几种变体(这代表了今天的尝试):

预处理器似乎无法完成这项工作。宏通过以下方式调用:

编译器会弹出以下内容:

编译器发出以下消息:

关于如何查看“已解决”#pragmas 的样子或它们有什么问题的任何想法?

谢谢,斯科特·法根

0 投票
1 回答
100 浏览

assembly - 仅当我使用自己的 prolog/epilogs 时 z/OS Metal C assemble 才会失败

我有一个 Metal C 程序,我试图通过 __asm(“...” : DS(staticdata)) 语句添加一些静态数据,但生成的汇编代码存在一些问题。

当我使用自己的序言和结语代码时,我得到:

记录 944 是“&MSIZE SETA @@LAB@3L”。

当我删除模块中各种例程的序言和结语的#pragmas 时,我得到了非常相似的代码,但它组装得很干净(为了方便起见,我重命名了程序):

无论出于何种原因,生成的 DS 使用 @@LAB@5,但“&MSIZE SETA @@LAB@5L”在这里组装没有错误。奇怪,因为第一个程序中的 @@LAB@3L 和第二个程序中的 @@LAB@5L 计算结果相同:

当我比较这两个片段时(我删除了右侧的十六进制偏移和序列信息),这就是我得到的:

片段完全相同,除了标签不同。

关于我可以在我的序言和结语中的任何一个/两个中所做的任何想法都会扰乱汇编程序导致此错误。

谢谢,斯科特

0 投票
1 回答
50 浏览

zos - 有没有办法让 IBM XL C/C++ Compiler, Metal Option 在全局范围内做一个 __asm DS 声明_NOT_ 是一个 EXTERNAL?

我在我的程序的全局范围内创建了几个类似(但不相同)的 WTO 宏列表形式的调用:

(是的,我知道一个在汇编语句声明中有标签,一个没有,这两种方式似乎都无关紧要)。

当它被编译时,编译器会发出关于这些变量的信息:

加上这个错误信息:

(请注意,如果删除其中一个声明,它可以正常工作)。

如果我理解正确,编译器会将名称缩短为八个字符(我没有使用 GOFF),因此这两个字符都与名称 XXXUTILS 发生冲突。

我知道我可以通过在声明中添加“静态”来防止全局范围内的其他类型的声明成为外部声明,例如

我在Inline 汇编语句(IBM 扩展)上花了一些时间,但不知道如何以某种方式将“静态”一词压缩到 __asm 语句中,或者是否有其他方法可以做到这一点。

有人对如何做到这一点有任何想法吗?

谢谢你,斯科特·法根